diff --git a/Doxyfile b/Doxyfile
index 08f7c191121e9f1f63faa0f57bd6fb363e5ae7e2..03c45e7e070cc1444dfcfffb5820102b741401ea 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -966,7 +966,7 @@ WARN_LOGFILE           =
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = ./src ./README.md
+INPUT                  = ./src ./README.md ./doxygen_overview.md
 
 # This tag can be used to specify the character encoding of the source files
 # that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses
@@ -1121,7 +1121,7 @@ EXAMPLE_RECURSIVE      = NO
 # that contain images that are to be included in the documentation (see the
 # \image command).
 
-IMAGE_PATH             = ./assets
+IMAGE_PATH = ./assets
 
 # The INPUT_FILTER tag can be used to specify a program that Doxygen should
 # invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1182,7 +1182,7 @@ FILTER_SOURCE_PATTERNS =
 # (index.html). This can be useful if you have a project on for instance GitHub
 # and want to reuse the introduction page also for the Doxygen output.
 
-USE_MDFILE_AS_MAINPAGE = README.md
+USE_MDFILE_AS_MAINPAGE = doxygen_overview.md
 
 # The Fortran standard specifies that for fixed formatted Fortran code all
 # characters from position 72 are to be considered as comment. A common
diff --git a/README.md b/README.md
index a03c84b4522db0d321691e3d2ab1417d19442c9e..858bd22193e0415260a3c30a41bd6eeadd2484d9 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,10 @@ gameplay!
 This project is part of the *Software Engineering* lecture at *ETH Zurich* in autumn semester 2024. By Marie Becker, Janne Berger, Martina
 Lehman, Aidan Meara, Michel Tarnow, and Hannah Winter.
 
-![Cards](./assets/cards.png)
+<div style="display: flex; align-items: center;">
+  <img src="./assets/cards.png" alt="Cards" style="height: 200px;">
+</div>
+
 
 
 ## 🚀 Features
@@ -97,11 +100,14 @@ server, run `./Wizard-server`. In new consoles, you can now start as many client
 ## 4 Play the Game
 
 Once a client is started, the connection panel shows up. Here every player can enter the server address and port (in most
-cases the default input can be left unchanged), as well as their player name. Next to these input fields, a *Rules* and a *Settings*
-button are shown on the bottom right of the screen. The buttons will be shown throughout the whole game and can be clicked
-to access the rules and the settings.
+cases the default input can be left unchanged), as well as their player name.
+If the player name chosen already exists in the game, a number will be automatically added to the name.
+Next to these input fields, a *Rules*
+button is shown on the bottom right of the screen. The button will be shown throughout the whole game and can be clicked
+to access the rules whenever needed.
+
+<img src="/assets/readme/connection_panel.png" width=50% height=50% alt="Connection panel"> <br>
 
-![Connection Panel](./assets/readme/connection_panel.png)
 
 After clicking on the *Connect* button, the lobby shows up. Here all players that have joined the game can be seen. The 
 *Start Game* button can be clicked to start a game once enough players joined, and the *Leave Game* button can be clicked
@@ -114,20 +120,31 @@ To start a game, at least 3 players have to connect to the server and join the g
 game is 6. Once at least 3 players are connected to the server and have joined the game, the *Start Game* button turns 
 purple and the game can be started by clicking the button. 
 
+If players decide throughout the waiting time that they want to leave the game again, they can press the *Leave Game* button
+and leave the Lobby. The player will be removed from the Lobby and the other players can keep waiting.
+
 <img src="assets/readme/lobby_six_players.png" width=50% height=50% alt="Lobby panel"> <br>
 
 Every round starts with an estimation phase. Here each player can enter their trick estimation by typing into the 
 provided input filed, and then submit it by clicking on the *Submit* button. In this phase of the game, each player can
 see their own cards shown at the bottom and the trump card shown on the left side of the screen. The current round number
 and the sum of already submitted trick estimations in shown in the middle of the screen and can help players submitting
-a valid estimate (e.g., estimate cannot be greater than the current round number). Above the *Leave Game* button, the 
-scoreboard can now be accessed by clicking on the *Scoreboard* button. This will be available throughout the whole game.
+a valid estimate (e.g., estimate cannot be greater than the current round number).
+
+Above the *Leave Game* button, the 
+scoreboard can now be accessed by clicking on the *Scoreboard* button.
+The scoreboard is available throughout the whole game and winning and loosing players are color-coded.
+If a player leaves the game now after it was already started, the game ends immediately for all players
+and the final scores are shown to everyone.
 
 <img src="assets/readme/estimation_panel.png" width=50% height=50% alt="Estimation phase"> <br>
 
-After every player has submitted their estimation, the play phase starts. Cards can be played by clicking on the 
-respective card. An announcement in middle of the screen shows whose turn it is, and played cards are displayed in the 
-middle of the screen as well. Below each players' name, the won and predicted numbers of tricks can be seen.
+After every player has submitted their estimation, the playing phase starts. Cards can be played by clicking on the 
+respective card. Hovering over cards increases their size to get a closer look.
+An announcement in the middle of the screen shows whose turn it is.
+The player whose turn it is, is also highlighted in purple. Played cards are displayed in the 
+middle of the screen as well and in the top left corner the round number and the sum of estimated tricks are shown.
+Below each players' name, the won and predicted numbers of tricks can be seen.
 
 <img src="assets/readme/play_phase_last_player.png" width=50% height=50% alt="Play phase"> <br>
 
@@ -137,7 +154,32 @@ the game, the winner is announced and the players can close the game.
 
 Have fun playing!
 
-## 5 Special Features
-- The game provides a Lobby where people can players can come and go until enough players have joined and the game is started.
-- It is always possible to leave the game early. 
-- See the current state of the game on the score board. Scores are color-coded marking the leading and loosing player.
+## Play on different devices
+
+When playing the game on a single device, the default server address *127.0.0.1* and server port *50505* 
+can be used during the connection phase.
+
+However, the game can also be played from different devices on the same wifi network 🛜 or if all devices are connected
+to the same VPN.
+In this case one player needs to host the server, while all other players only run a client.
+When connecting to the game, all players have to enter the private IP address of the player hosting the server
+in the *server address* field. The default port *50505* can be kept.
+
+### Get local IP address to host server
+On macOS version 10.4 throughout the latest version run the following command in the terminal:
+```
+ipconfig getifaddr en0
+```
+On Ubuntu 24.04 you can use the `hostname` command in the terminal:
+```
+hostname -I
+```
+
+## Find Coding Documentation
+
+The code in this project was documented via [Doxygen](https://doxygen.nl/).
+Doxygen documentation can be accessed by opening the `index.html` file in the `html` folder.
+This can be automatically done by running the following command in the terminal out of the `wizard` project folder:
+```
+open ./html/index.html
+```
\ No newline at end of file
diff --git a/doxygen_overview.md b/doxygen_overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..420c517e5ee5b3c2802009a40893bf029a72b5d1
--- /dev/null
+++ b/doxygen_overview.md
@@ -0,0 +1,180 @@
+# Software Engineering Project - Wizard
+Welcome to **Wizard**, a C++ implementation of the classic card game. Compete with your friends in exciting multiplayer
+gameplay!
+
+This project is part of the *Software Engineering* lecture at *ETH Zurich* in autumn semester 2024. By Marie Becker, Janne Berger, Martina
+Lehman, Aidan Meara, Michel Tarnow, and Hannah Winter.
+
+\image html cards.png "Cards" width=500
+
+## 🚀 Features
+- 🌐 **Multiplayer Gameplay:** Play with 3 to 6 players.
+- 🔄 **Synchronized Game State:** Real-time updates for all players.
+- 🖼 **Elegant User Interface:** A visually appealing UI powered by wxWidgets.
+
+---
+
+You can read the game's rules [here](https://blog.amigo-spiele.de/content/ap/rule/06900-GB-AmigoRule.pdf).
+The implementation features a client/server architecture for multiplayer scenarios. It uses [wxWidgets](https://www.wxwidgets.org/)
+for the GUI, [sockpp](https://github.com/fpagliughi/sockpp) for the network interface, [rapidjson](https://rapidjson.org/md_doc_tutorial.html)
+for object serialization, and [googletest](https://github.com/google/googletest) for the unit tests.
+
+---
+
+## 1 Overview
+
+The game and source files are available on GitLab on the main branch. The game was developed based on the provided
+[LAMA example project](https://gitlab.ethz.ch/hraymond/cse-lama-example-project) game. This project consists of a
+**server** and a **client**, each with their own main.cpp file. Each player can run their own client and connect to
+a server in the same local network.
+
+---
+
+## 2 Compile Instructions
+
+This project only works on UNIX systems (Linux / macOS). We thus only explain how to compile and run the game on these
+systems. The following description was tested on Ubuntu 24.04 and on macOS Sequoia.
+
+### 2.1 Prepare OS Environment
+
+If your OS does not yet have git installed, install git by running `sudo apt-get install git` on Ubuntu or by
+running `xcode-select --install` on macOS (this installs git as well). The Wizard repository can then be cloned by
+running `git clone https://gitlab.ethz.ch/beckermar/wizard.git` (clone with HTTPS) or by running
+`git clone git@gitlab.ethz.ch:beckermar/wizard.git` (clone with SSH) inside the directory that should contain the game.
+Cloning the game as a first step also makes provided scripts for preparing the OS environment and for compiling the code
+available.
+
+#### 2.1.1 Ubuntu 24.04
+
+The necessary packages and software can either be installed manually or by running the provided script.
+
+To use the provided script, run `bash scripts/prepare_ubuntu.sh` inside the **wizard** directory.
+
+To manually prepare Ubuntu, execute the following commands:
+1. `sudo apt-get update` (update package list)
+2. `sudo apt-get install build-essential` (install software to build from source)
+3. `sudo apt-get install libwxgtk3.2-dev` (install wxwidgets, use libwxgtk3.0-gtk3-dev on Ubuntu 20.04 / 22.04)
+4. `sudo apt-get install cmake` (install cmake)
+5. `sudo reboot` (reboot system)
+
+#### 2.1.2 macOS Sequoia
+
+The necessary packages and software can either be installed manually or by running the provided script.
+
+To use the provided script, run `zsh scripts/prepare_macos.sh` inside the **wizard** directory.
+
+To manually prepare macOS, execute the following commands:
+1. `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` (install homebrew)
+2. `brew install cmake` (install cmake)
+3. `brew install wxwidgets` (install wxwidgets)
+
+### 2.2 Compile Code
+
+Compiling the code creates executables for the client (Wizard-client) and for the server (Wizard-server).
+
+#### 2.2.1 Ubuntu 24.04
+
+Compiling the code can be done by running the provided script.
+
+To use the provided script, run `bash scripts/compile_ubuntu.sh` inside the **wizard** directory.
+
+#### 2.2.1 macOS Sequoia
+
+Compiling the code can be done by running the provided script.
+
+To use the provided script, run `zsh scripts/compile_macos.sh` inside the **wizard** directory.
+
+---
+
+## 3 Run the Game
+
+After compiling the code, navigate into the **cmake-build-debug** directory inside the **wizard** directory. To start a
+server, run `./Wizard-server`. In new consoles, you can now start as many clients as you wish by running `./Wizard-client`.
+
+---
+
+## 4 Play the Game
+
+Once a client is started, the connection panel shows up. Here every player can enter the server address and port (in most
+cases the default input can be left unchanged), as well as their player name.
+If the player name chosen already exists in the game, a number will be automatically added to the name.
+Next to these input fields, a *Rules*
+button is shown on the bottom right of the screen. The button will be shown throughout the whole game and can be clicked
+to access the rules whenever needed.
+
+\image html readme/connection_panel.png "Connection panel" width=700
+
+After clicking on the *Connect* button, the lobby shows up. Here all players that have joined the game can be seen. The
+*Start Game* button can be clicked to start a game once enough players joined, and the *Leave Game* button can be clicked
+to leave the game. This is possible throughout the whole game, however, if a player leaves the game after it has started,
+the game is over.
+
+\image html readme/lobby_one_player.png "Lobby panel" width=700
+
+To start a game, at least 3 players have to connect to the server and join the game. The maximum number of players per
+game is 6. Once at least 3 players are connected to the server and have joined the game, the *Start Game* button turns
+purple and the game can be started by clicking the button.
+
+If players decide throughout the waiting time that they want to leave the game again, they can press the *Leave Game* button
+and leave the Lobby. The player will be removed from the Lobby and the other players can keep waiting.
+
+\image html readme/lobby_six_players.png "Lobby panel" width=700
+
+Every round starts with an estimation phase. Here each player can enter their trick estimation by typing into the
+provided input filed, and then submit it by clicking on the *Submit* button. In this phase of the game, each player can
+see their own cards shown at the bottom and the trump card shown on the left side of the screen. The current round number
+and the sum of already submitted trick estimations in shown in the middle of the screen and can help players submitting
+a valid estimate (e.g., estimate cannot be greater than the current round number).
+
+Above the *Leave Game* button, the
+scoreboard can now be accessed by clicking on the *Scoreboard* button.
+The scoreboard is available throughout the whole game and winning and loosing players are color-coded.
+If a player leaves the game now after it was already started, the game ends immediately for all players
+and the final scores are shown to everyone.
+
+\image html readme/estimation_panel.png "Estimation phase" width=700
+
+After every player has submitted their estimation, the playing phase starts. Cards can be played by clicking on the
+respective card. Hovering over cards increases their size to get a closer look.
+An announcement in the middle of the screen shows whose turn it is.
+The player whose turn it is, is also highlighted in purple. Played cards are displayed in the
+middle of the screen as well and in the top left corner the round number and the sum of estimated tricks are shown.
+Below each players' name, the won and predicted numbers of tricks can be seen.
+
+\image html readme/play_phase_last_player.png "Play phase" width=700
+
+At the end of each trick, the winner is shown and the new trick starts automatically. If the trick is the last trick of
+a round, also the points gained or lost in this round are shown, and the new round starts automatically. At the end of
+the game, the winner is announced and the players can close the game.
+
+Have fun playing!
+
+## Play on different devices
+
+When playing the game on a single device, the default server address *127.0.0.1* and server port *50505*
+can be used during the connection phase.
+
+However, the game can also be played from different devices on the same wifi network 🛜 or if all devices are connected
+to the same VPN.
+In this case one player needs to host the server, while all other players only run a client.
+When connecting to the game, all players have to enter the private IP address of the player hosting the server
+in the *server address* field. The default port *50505* can be kept.
+
+### Get local IP address to host server
+On macOS version 10.4 throughout the latest version run the following command in the terminal:
+```
+ipconfig getifaddr en0
+```
+On Ubuntu 24.04 you can use the `hostname` command in the terminal:
+```
+hostname -I
+```
+
+## Find Coding Documentation
+
+The code in this project was documented via [Doxygen](https://doxygen.nl/).
+Doxygen documentation can be accessed by opening the `index.html` file in the `html` folder.
+This can be automatically done by running the following command in the terminal out of the `wizard` project folder:
+```
+open ./html/index.html
+```
\ No newline at end of file
diff --git a/html/_game_controller_8h_source.html b/html/_game_controller_8h_source.html
index 5d600c93a6a82a7c4243c4f6264c8809d956fe12..7b382fd0074c12aae5cb9046d06eb53068d4e26e 100644
--- a/html/_game_controller_8h_source.html
+++ b/html/_game_controller_8h_source.html
@@ -122,26 +122,24 @@ $(function(){ initResizable(false); });
 <div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span>    <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_game_controller.html#a3c350056b82df662c946cb9119f11ced">showNewRoundMessage</a>(<a class="code hl_class" href="classgame__state.html">game_state</a>* oldGameState, <a class="code hl_class" href="classgame__state.html">game_state</a>* newGameState);</div>
 <div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span>    <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_game_controller.html#a8108659ad09724318c3a251d93bd5869">showTrickOverMessage</a>(<span class="keyword">const</span> <a class="code hl_class" href="classplayer.html">player</a>* winner);</div>
 <div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>    <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_game_controller.html#abb91c546ab8400c1e2e9f2a2ccc8298f">showGameOverMessage</a>();</div>
-<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>    <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_game_controller.html#a21eea505305d56439efb835e1e148c2f">closeGameWindow</a>();</div>
-<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span> </div>
-<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="keyword">private</span>:</div>
-<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_game_window.html">GameWindow</a>* _gameWindow; </div>
-<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_connection_panel.html">ConnectionPanel</a>* _connectionPanel; </div>
-<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_main_game_panel_wizard.html">MainGamePanelWizard</a>* _mainGamePanelWizard; </div>
-<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_trick_estimation_panel.html">TrickEstimationPanel</a>* _trickEstimationPanel; </div>
-<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span> </div>
-<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>    <span class="keyword">static</span> <a class="code hl_class" href="classplayer.html">player</a>* _me; </div>
-<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span>    <span class="keyword">static</span> <a class="code hl_class" href="classgame__state.html">game_state</a>* _currentGameState; </div>
-<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span> </div>
-<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>};</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span> </div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="keyword">private</span>:</div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_game_window.html">GameWindow</a>* _gameWindow; </div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_connection_panel.html">ConnectionPanel</a>* _connectionPanel; </div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_main_game_panel_wizard.html">MainGamePanelWizard</a>* _mainGamePanelWizard; </div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>    <span class="keyword">static</span> <a class="code hl_class" href="class_trick_estimation_panel.html">TrickEstimationPanel</a>* _trickEstimationPanel; </div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span> </div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>    <span class="keyword">static</span> <a class="code hl_class" href="classplayer.html">player</a>* _me; </div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>    <span class="keyword">static</span> <a class="code hl_class" href="classgame__state.html">game_state</a>* _currentGameState; </div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span> </div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>};</div>
 </div>
-<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span> </div>
-<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span> </div>
-<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="preprocessor">#endif </span><span class="comment">//WIZARDUI_GAMECONTROLLER_H</span></div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span> </div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span> </div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="preprocessor">#endif </span><span class="comment">//WIZARDUI_GAMECONTROLLER_H</span></div>
 <div class="ttc" id="aclass_connection_panel_html"><div class="ttname"><a href="class_connection_panel.html">ConnectionPanel</a></div><div class="ttdef"><b>Definition</b> ConnectionPanel.h:8</div></div>
 <div class="ttc" id="aclass_game_controller_html"><div class="ttname"><a href="class_game_controller.html">GameController</a></div><div class="ttdoc">Controls visualization of the game state and processes client actions.</div><div class="ttdef"><b>Definition</b> GameController.h:20</div></div>
 <div class="ttc" id="aclass_game_controller_html_a023da21da545374ee46fb873149976c4"><div class="ttname"><a href="class_game_controller.html#a023da21da545374ee46fb873149976c4">GameController::connectToServer</a></div><div class="ttdeci">static void connectToServer()</div><div class="ttdoc">Handles connection to server when a user joins a game.</div><div class="ttdef"><b>Definition</b> GameController.cpp:45</div></div>
-<div class="ttc" id="aclass_game_controller_html_a21eea505305d56439efb835e1e148c2f"><div class="ttname"><a href="class_game_controller.html#a21eea505305d56439efb835e1e148c2f">GameController::closeGameWindow</a></div><div class="ttdeci">static void closeGameWindow()</div><div class="ttdoc">Closes game window.</div><div class="ttdef"><b>Definition</b> GameController.cpp:321</div></div>
 <div class="ttc" id="aclass_game_controller_html_a3c350056b82df662c946cb9119f11ced"><div class="ttname"><a href="class_game_controller.html#a3c350056b82df662c946cb9119f11ced">GameController::showNewRoundMessage</a></div><div class="ttdeci">static void showNewRoundMessage(game_state *oldGameState, game_state *newGameState)</div><div class="ttdoc">Shows message that round has finished and current scores of players at the end of a round.</div><div class="ttdef"><b>Definition</b> GameController.cpp:234</div></div>
 <div class="ttc" id="aclass_game_controller_html_a5f1023f2029e5dbb25b795a0606e06a9"><div class="ttname"><a href="class_game_controller.html#a5f1023f2029e5dbb25b795a0606e06a9">GameController::processEstimateTricks</a></div><div class="ttdeci">static void processEstimateTricks()</div><div class="ttdoc">Process input from trick estimation panel and trigger estimateTricks function.</div><div class="ttdef"><b>Definition</b> GameController.cpp:190</div></div>
 <div class="ttc" id="aclass_game_controller_html_a6a43eb061a9882b3937fc88bb4794324"><div class="ttname"><a href="class_game_controller.html#a6a43eb061a9882b3937fc88bb4794324">GameController::showStatus</a></div><div class="ttdeci">static void showStatus(const std::string &amp;message)</div><div class="ttdoc">Set status message.</div><div class="ttdef"><b>Definition</b> GameController.cpp:229</div></div>
diff --git a/html/class_game_controller-members.html b/html/class_game_controller-members.html
index 6aa6a478996ed3c7ffcf71b4cd8bfe8a5d4733d0..e4c1ac0f0e7d4c27d99ac9af595e41543c3a023d 100644
--- a/html/class_game_controller-members.html
+++ b/html/class_game_controller-members.html
@@ -91,21 +91,20 @@ $(function(){ initResizable(false); });
 
 <p>This is the complete list of members for <a class="el" href="class_game_controller.html">GameController</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a21eea505305d56439efb835e1e148c2f">closeGameWindow</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a023da21da545374ee46fb873149976c4">connectToServer</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#abd110563d0f37f06096176c199d22055">estimateTricks</a>(int nof_tricks)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#abec8c73ea01e4b7e01b2ca1d932e0c16">getMainThreadEventHandler</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a8889bad76bc35487d3391fb8a5791616">init</a>(GameWindow *gameWindow)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a8d42b2e41759bfd65cdebad87437369e">leaveGame</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a87b164e2094901861e5b47056634facc">playCard</a>(card *cardToPlay)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a5f1023f2029e5dbb25b795a0606e06a9">processEstimateTricks</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#adf043f9026a62f634a873c9f9d292034">showError</a>(const std::string &amp;title, const std::string &amp;message)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#abb91c546ab8400c1e2e9f2a2ccc8298f">showGameOverMessage</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a3c350056b82df662c946cb9119f11ced">showNewRoundMessage</a>(game_state *oldGameState, game_state *newGameState)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a6a43eb061a9882b3937fc88bb4794324">showStatus</a>(const std::string &amp;message)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a8108659ad09724318c3a251d93bd5869">showTrickOverMessage</a>(const player *winner)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a8f30ab3ff471ac0a5c8b88dc7fea45f4">startGame</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a994773f79be8c9e8dc8c19ee2d389103">updateGameState</a>(game_state *newGameState)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a023da21da545374ee46fb873149976c4">connectToServer</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#abd110563d0f37f06096176c199d22055">estimateTricks</a>(int nof_tricks)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#abec8c73ea01e4b7e01b2ca1d932e0c16">getMainThreadEventHandler</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a8889bad76bc35487d3391fb8a5791616">init</a>(GameWindow *gameWindow)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a8d42b2e41759bfd65cdebad87437369e">leaveGame</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a87b164e2094901861e5b47056634facc">playCard</a>(card *cardToPlay)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a5f1023f2029e5dbb25b795a0606e06a9">processEstimateTricks</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#adf043f9026a62f634a873c9f9d292034">showError</a>(const std::string &amp;title, const std::string &amp;message)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#abb91c546ab8400c1e2e9f2a2ccc8298f">showGameOverMessage</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a3c350056b82df662c946cb9119f11ced">showNewRoundMessage</a>(game_state *oldGameState, game_state *newGameState)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a6a43eb061a9882b3937fc88bb4794324">showStatus</a>(const std::string &amp;message)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a8108659ad09724318c3a251d93bd5869">showTrickOverMessage</a>(const player *winner)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_game_controller.html#a8f30ab3ff471ac0a5c8b88dc7fea45f4">startGame</a>()</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_game_controller.html#a994773f79be8c9e8dc8c19ee2d389103">updateGameState</a>(game_state *newGameState)</td><td class="entry"><a class="el" href="class_game_controller.html">GameController</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/html/class_game_controller.html b/html/class_game_controller.html
index c42c06586df1924d687655a7e9ebe2ebfc367595..3e550c04314ebd7f1d97c9d89fdb21690b67af04 100644
--- a/html/class_game_controller.html
+++ b/html/class_game_controller.html
@@ -146,10 +146,6 @@ static void&#160;</td><td class="memItemRight" valign="bottom"><b>processEstimat
 static void&#160;</td><td class="memItemRight" valign="bottom"><b>showGameOverMessage</b> ()</td></tr>
 <tr class="memdesc:abb91c546ab8400c1e2e9f2a2ccc8298f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shows message at the end of the game that the game has ended and states the winner. <br /></td></tr>
 <tr class="separator:abb91c546ab8400c1e2e9f2a2ccc8298f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a21eea505305d56439efb835e1e148c2f" id="r_a21eea505305d56439efb835e1e148c2f"><td class="memItemLeft" align="right" valign="top"><a id="a21eea505305d56439efb835e1e148c2f" name="a21eea505305d56439efb835e1e148c2f"></a>
-static void&#160;</td><td class="memItemRight" valign="bottom"><b>closeGameWindow</b> ()</td></tr>
-<tr class="memdesc:a21eea505305d56439efb835e1e148c2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Closes game window. <br /></td></tr>
-<tr class="separator:a21eea505305d56439efb835e1e148c2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Controls visualization of the game state and processes client actions. </p>
diff --git a/html/doxygen_crawl.html b/html/doxygen_crawl.html
index 94702ae3b7dda12450cdee2135b94c033656c7dc..f330d3b3ad9243e5e37d0fb86ffcc22f2295016f 100644
--- a/html/doxygen_crawl.html
+++ b/html/doxygen_crawl.html
@@ -50,6 +50,7 @@
 <a href="player__manager_8h_source.html"/>
 <a href="request__handler_8h_source.html"/>
 <a href="server__network__manager_8h_source.html"/>
+<a href="md__r_e_a_d_m_e.html"/>
 <a href="classcard.html"/>
 <a href="classcard-members.html"/>
 <a href="classclient__request.html"/>
@@ -156,6 +157,7 @@
 <a href="dir_c48c410f804f8c93559dbea56e74ba89.html"/>
 <a href="index.html"/>
 <a href="doxygen_crawl.html"/>
+<a href="pages.html"/>
 <a href="annotated.html"/>
 <a href="classes.html"/>
 <a href="hierarchy.html"/>
@@ -217,7 +219,6 @@
 <a href="class_error_dialog.html"/>
 <a href="class_game_controller.html"/>
 <a href="class_game_controller.html#a023da21da545374ee46fb873149976c4"/>
-<a href="class_game_controller.html#a21eea505305d56439efb835e1e148c2f"/>
 <a href="class_game_controller.html#a3c350056b82df662c946cb9119f11ced"/>
 <a href="class_game_controller.html#a5f1023f2029e5dbb25b795a0606e06a9"/>
 <a href="class_game_controller.html#a6a43eb061a9882b3937fc88bb4794324"/>
@@ -410,21 +411,38 @@
 <a href="hand_8h_source.html"/>
 <a href="hierarchy.html"/>
 <a href="index.html"/>
-<a href="index.html#autotoc_md1"/>
-<a href="index.html#autotoc_md10"/>
-<a href="index.html#autotoc_md11"/>
-<a href="index.html#autotoc_md12"/>
-<a href="index.html#autotoc_md14"/>
-<a href="index.html#autotoc_md16"/>
-<a href="index.html#autotoc_md17"/>
-<a href="index.html#autotoc_md4"/>
-<a href="index.html#autotoc_md6"/>
-<a href="index.html#autotoc_md7"/>
-<a href="index.html#autotoc_md8"/>
-<a href="index.html#autotoc_md9"/>
+<a href="index.html#autotoc_md21"/>
+<a href="index.html#autotoc_md24"/>
+<a href="index.html#autotoc_md26"/>
+<a href="index.html#autotoc_md27"/>
+<a href="index.html#autotoc_md28"/>
+<a href="index.html#autotoc_md29"/>
+<a href="index.html#autotoc_md30"/>
+<a href="index.html#autotoc_md31"/>
+<a href="index.html#autotoc_md32"/>
+<a href="index.html#autotoc_md34"/>
+<a href="index.html#autotoc_md36"/>
+<a href="index.html#autotoc_md37"/>
+<a href="index.html#autotoc_md38"/>
+<a href="index.html#autotoc_md39"/>
 <a href="join__game__request_8h_source.html"/>
 <a href="json__utils_8h_source.html"/>
 <a href="leave__game__request_8h_source.html"/>
+<a href="md__r_e_a_d_m_e.html"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md1"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md10"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md11"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md12"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md14"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md16"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md17"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md18"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md19"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md4"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md6"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md7"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md8"/>
+<a href="md__r_e_a_d_m_e.html#autotoc_md9"/>
 <a href="play__card__request_8h_source.html"/>
 <a href="player_8h_source.html"/>
 <a href="player__manager_8h_source.html"/>
diff --git a/html/functions.html b/html/functions.html
index 192a84adcdcfa9c50df0af25ac430512d766d4bc..be499d78b562d741b9bcd4812351011a32caa77d 100644
--- a/html/functions.html
+++ b/html/functions.html
@@ -100,7 +100,6 @@ $(function(){ initResizable(false); });
 
 <h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
 <li>card()&#160;:&#160;<a class="el" href="classcard.html#a764d65641c619aedf1842a30e54905b7">card</a></li>
-<li>closeGameWindow()&#160;:&#160;<a class="el" href="class_game_controller.html#a21eea505305d56439efb835e1e148c2f">GameController</a></li>
 <li>connectToServer()&#160;:&#160;<a class="el" href="class_game_controller.html#a023da21da545374ee46fb873149976c4">GameController</a></li>
 </ul>
 
diff --git a/html/functions_func.html b/html/functions_func.html
index 039eeca90056bb7b024efea8391b3102d8d5032a..d4c07cb7a71069efc5779eb8c911615dc5ed0826 100644
--- a/html/functions_func.html
+++ b/html/functions_func.html
@@ -100,7 +100,6 @@ $(function(){ initResizable(false); });
 
 <h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
 <li>card()&#160;:&#160;<a class="el" href="classcard.html#a764d65641c619aedf1842a30e54905b7">card</a></li>
-<li>closeGameWindow()&#160;:&#160;<a class="el" href="class_game_controller.html#a21eea505305d56439efb835e1e148c2f">GameController</a></li>
 <li>connectToServer()&#160;:&#160;<a class="el" href="class_game_controller.html#a023da21da545374ee46fb873149976c4">GameController</a></li>
 </ul>
 
diff --git a/html/index.html b/html/index.html
index d70aa68c949ba06a58d7686efea024ab08d2cd65..755c84e6eca25088b2ce6df1c128a5a59661da28 100644
--- a/html/index.html
+++ b/html/index.html
@@ -88,14 +88,14 @@ $(function(){ initResizable(false); });
   <div class="headertitle"><div class="title">Software Engineering Project - <a class="el" href="class_wizard.html">Wizard</a> </div></div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p><a class="anchor" id="md__r_e_a_d_m_e"></a></p>
+<div class="textblock"><p><a class="anchor" id="md_doxygen__overview"></a></p>
 <p>Welcome to <b><a class="el" href="class_wizard.html">Wizard</a></b>, a C++ implementation of the classic card game. Compete with your friends in exciting multiplayer gameplay!</p>
 <p>This project is part of the <em>Software Engineering</em> lecture at <em>ETH Zurich</em> in autumn semester 2024. By Marie Becker, Janne Berger, Martina Lehman, Aidan Meara, Michel Tarnow, and Hannah Winter.</p>
 <div class="image">
-<img src="cards.png" alt=""/>
+<img src="cards.png" alt="" width="500"/>
 <div class="caption">
 Cards</div></div>
-    <h1><a class="anchor" id="autotoc_md1"></a>
+<h1><a class="anchor" id="autotoc_md21"></a>
 🚀 Features</h1>
 <ul>
 <li>🌐 <b>Multiplayer Gameplay:</b> Play with 3 to 6 players.</li>
@@ -105,17 +105,17 @@ Cards</div></div>
 <hr  />
 <p>You can read the game's rules <a href="https://blog.amigo-spiele.de/content/ap/rule/06900-GB-AmigoRule.pdf">here</a>. The implementation features a client/server architecture for multiplayer scenarios. It uses <a href="https://www.wxwidgets.org/">wxWidgets</a> for the GUI, <a href="https://github.com/fpagliughi/sockpp">sockpp</a> for the network interface, <a href="https://rapidjson.org/md_doc_tutorial.html">rapidjson</a> for object serialization, and <a href="https://github.com/google/googletest">googletest</a> for the unit tests.</p>
 <hr  />
-<h1><a class="anchor" id="autotoc_md4"></a>
+<h1><a class="anchor" id="autotoc_md24"></a>
 1 Overview</h1>
 <p>The game and source files are available on GitLab on the main branch. The game was developed based on the provided <a href="https://gitlab.ethz.ch/hraymond/cse-lama-example-project">LAMA example project</a> game. This project consists of a <b>server</b> and a <b>client</b>, each with their own main.cpp file. Each player can run their own client and connect to a server in the same local network.</p>
 <hr  />
-<h1><a class="anchor" id="autotoc_md6"></a>
+<h1><a class="anchor" id="autotoc_md26"></a>
 2 Compile Instructions</h1>
 <p>This project only works on UNIX systems (Linux / macOS). We thus only explain how to compile and run the game on these systems. The following description was tested on Ubuntu 24.04 and on macOS Sequoia.</p>
-<h2><a class="anchor" id="autotoc_md7"></a>
+<h2><a class="anchor" id="autotoc_md27"></a>
 2.1 Prepare OS Environment</h2>
 <p>If your OS does not yet have git installed, install git by running <code>sudo apt-get install git</code> on Ubuntu or by running <code>xcode-select --install</code> on macOS (this installs git as well). The <a class="el" href="class_wizard.html">Wizard</a> repository can then be cloned by running <code>git clone <a href="https://gitlab.ethz.ch/beckermar/wizard.git">https://gitlab.ethz.ch/beckermar/wizard.git</a></code> (clone with HTTPS) or by running <code>git clone git@gitlab.ethz.ch:beckermar/wizard.git</code> (clone with SSH) inside the directory that should contain the game. Cloning the game as a first step also makes provided scripts for preparing the OS environment and for compiling the code available.</p>
-<h3><a class="anchor" id="autotoc_md8"></a>
+<h3><a class="anchor" id="autotoc_md28"></a>
 2.1.1 Ubuntu 24.04</h3>
 <p>The necessary packages and software can either be installed manually or by running the provided script.</p>
 <p>To use the provided script, run <code>bash scripts/prepare_ubuntu.sh</code> inside the <b>wizard</b> directory.</p>
@@ -126,7 +126,7 @@ Cards</div></div>
 <li><code>sudo apt-get install cmake</code> (install cmake)</li>
 <li><code>sudo reboot</code> (reboot system)</li>
 </ol>
-<h3><a class="anchor" id="autotoc_md9"></a>
+<h3><a class="anchor" id="autotoc_md29"></a>
 2.1.2 macOS Sequoia</h3>
 <p>The necessary packages and software can either be installed manually or by running the provided script.</p>
 <p>To use the provided script, run <code>zsh scripts/prepare_macos.sh</code> inside the <b>wizard</b> directory.</p>
@@ -135,49 +135,65 @@ Cards</div></div>
 <li><code>brew install cmake</code> (install cmake)</li>
 <li><code>brew install wxwidgets</code> (install wxwidgets)</li>
 </ol>
-<h2><a class="anchor" id="autotoc_md10"></a>
+<h2><a class="anchor" id="autotoc_md30"></a>
 2.2 Compile Code</h2>
 <p>Compiling the code creates executables for the client (Wizard-client) and for the server (Wizard-server).</p>
-<h3><a class="anchor" id="autotoc_md11"></a>
+<h3><a class="anchor" id="autotoc_md31"></a>
 2.2.1 Ubuntu 24.04</h3>
 <p>Compiling the code can be done by running the provided script.</p>
 <p>To use the provided script, run <code>bash scripts/compile_ubuntu.sh</code> inside the <b>wizard</b> directory.</p>
-<h3><a class="anchor" id="autotoc_md12"></a>
+<h3><a class="anchor" id="autotoc_md32"></a>
 2.2.1 macOS Sequoia</h3>
 <p>Compiling the code can be done by running the provided script.</p>
 <p>To use the provided script, run <code>zsh scripts/compile_macos.sh</code> inside the <b>wizard</b> directory.</p>
 <hr  />
-<h1><a class="anchor" id="autotoc_md14"></a>
+<h1><a class="anchor" id="autotoc_md34"></a>
 3 Run the Game</h1>
 <p>After compiling the code, navigate into the <b>cmake-build-debug</b> directory inside the <b>wizard</b> directory. To start a server, run <code>./Wizard-server</code>. In new consoles, you can now start as many clients as you wish by running <code>./Wizard-client</code>.</p>
 <hr  />
-<h1><a class="anchor" id="autotoc_md16"></a>
+<h1><a class="anchor" id="autotoc_md36"></a>
 4 Play the Game</h1>
-<p>Once a client is started, the connection panel shows up. Here every player can enter the server address and port (in most cases the default input can be left unchanged), as well as their player name. Next to these input fields, a <em>Rules</em> and a <em>Settings</em> button are shown on the bottom right of the screen. The buttons will be shown throughout the whole game and can be clicked to access the rules and the settings.</p>
-<p><img src="./readme/connection_panel.png" alt="Connection panel" width="50%" height="50%" class="inline"/> <br  />
-</p>
+<p>Once a client is started, the connection panel shows up. Here every player can enter the server address and port (in most cases the default input can be left unchanged), as well as their player name. If the player name chosen already exists in the game, a number will be automatically added to the name. Next to these input fields, a <em>Rules</em> button is shown on the bottom right of the screen. The button will be shown throughout the whole game and can be clicked to access the rules whenever needed.</p>
+<div class="image">
+<img src="connection_panel.png" alt="" width="700"/>
+<div class="caption">
+Connection panel</div></div>
 <p>After clicking on the <em>Connect</em> button, the lobby shows up. Here all players that have joined the game can be seen. The <em>Start Game</em> button can be clicked to start a game once enough players joined, and the <em>Leave Game</em> button can be clicked to leave the game. This is possible throughout the whole game, however, if a player leaves the game after it has started, the game is over.</p>
-<p><img src="assets/readme/lobby_one_player.png" alt="Lobby panel" width="50%" height="50%" class="inline"/> <br  />
-</p>
+<div class="image">
+<img src="lobby_one_player.png" alt="" width="700"/>
+<div class="caption">
+Lobby panel</div></div>
 <p>To start a game, at least 3 players have to connect to the server and join the game. The maximum number of players per game is 6. Once at least 3 players are connected to the server and have joined the game, the <em>Start Game</em> button turns purple and the game can be started by clicking the button.</p>
-<p><img src="assets/readme/lobby_six_players.png" alt="Lobby panel" width="50%" height="50%" class="inline"/> <br  />
-</p>
-<p>Every round starts with an estimation phase. Here each player can enter their trick estimation by typing into the provided input filed, and then submit it by clicking on the <em>Submit</em> button. In this phase of the game, each player can see their own cards shown at the bottom and the trump card shown on the left side of the screen. The current round number and the sum of already submitted trick estimations in shown in the middle of the screen and can help players submitting a valid estimate (e.g., estimate cannot be greater than the current round number). Above the <em>Leave Game</em> button, the scoreboard can now be accessed by clicking on the <em>Scoreboard</em> button. This will be available throughout the whole game.</p>
-<p><img src="assets/readme/estimation_panel.png" alt="Estimation phase" width="50%" height="50%" class="inline"/> <br  />
-</p>
-<p>After every player has submitted their estimation, the play phase starts. Cards can be played by clicking on the respective card. An announcement in middle of the screen shows whose turn it is, and played cards are displayed in the middle of the screen as well. Below each players' name, the won and predicted numbers of tricks can be seen.</p>
-<p><img src="assets/readme/play_phase_last_player.png" alt="Play phase" width="50%" height="50%" class="inline"/> <br  />
-</p>
+<p>If players decide throughout the waiting time that they want to leave the game again, they can press the <em>Leave Game</em> button and leave the Lobby. The player will be removed from the Lobby and the other players can keep waiting.</p>
+<div class="image">
+<img src="lobby_six_players.png" alt="" width="700"/>
+<div class="caption">
+Lobby panel</div></div>
+<p>Every round starts with an estimation phase. Here each player can enter their trick estimation by typing into the provided input filed, and then submit it by clicking on the <em>Submit</em> button. In this phase of the game, each player can see their own cards shown at the bottom and the trump card shown on the left side of the screen. The current round number and the sum of already submitted trick estimations in shown in the middle of the screen and can help players submitting a valid estimate (e.g., estimate cannot be greater than the current round number).</p>
+<p>Above the <em>Leave Game</em> button, the scoreboard can now be accessed by clicking on the <em>Scoreboard</em> button. The scoreboard is available throughout the whole game and winning and loosing players are color-coded. If a player leaves the game now after it was already started, the game ends immediately for all players and the final scores are shown to everyone.</p>
+<div class="image">
+<img src="estimation_panel.png" alt="" width="700"/>
+<div class="caption">
+Estimation phase</div></div>
+<p>After every player has submitted their estimation, the playing phase starts. Cards can be played by clicking on the respective card. Hovering over cards increases their size to get a closer look. An announcement in the middle of the screen shows whose turn it is. The player whose turn it is, is also highlighted in purple. Played cards are displayed in the middle of the screen as well and in the top left corner the round number and the sum of estimated tricks are shown. Below each players' name, the won and predicted numbers of tricks can be seen.</p>
+<div class="image">
+<img src="play_phase_last_player.png" alt="" width="700"/>
+<div class="caption">
+Play phase</div></div>
 <p>At the end of each trick, the winner is shown and the new trick starts automatically. If the trick is the last trick of a round, also the points gained or lost in this round are shown, and the new round starts automatically. At the end of the game, the winner is announced and the players can close the game.</p>
 <p>Have fun playing!</p>
-<h1><a class="anchor" id="autotoc_md17"></a>
-5 Special Features</h1>
-<ul>
-<li>The game provides a Lobby where people can players can come and go until enough players have joined and the game is started.</li>
-<li>It is always possible to leave the game early.</li>
-<li>See the current state of the game on the score board. Scores are color-coded marking the leading and loosing player. </li>
-</ul>
-</div></div><!-- PageDoc -->
+<h1><a class="anchor" id="autotoc_md37"></a>
+Play on different devices</h1>
+<p>When playing the game on a single device, the default server address <em>127.0.0.1</em> and server port <em>50505</em> can be used during the connection phase.</p>
+<p>However, the game can also be played from different devices on the same wifi network 🛜 or if all devices are connected to the same VPN. In this case one player needs to host the server, while all other players only run a client. When connecting to the game, all players have to enter the private IP address of the player hosting the server in the <em>server address</em> field. The default port <em>50505</em> can be kept.</p>
+<h2><a class="anchor" id="autotoc_md38"></a>
+Get local IP address to host server</h2>
+<p>On macOS version 10.4 throughout the latest version run the following command in the terminal: </p><div class="fragment"><div class="line">ipconfig getifaddr en0</div>
+</div><!-- fragment --><p> On Ubuntu 24.04 you can use the <code>hostname</code> command in the terminal: </p><div class="fragment"><div class="line">hostname -I</div>
+</div><!-- fragment --><h1><a class="anchor" id="autotoc_md39"></a>
+Find Coding Documentation</h1>
+<p>The code in this project was documented via <a href="https://doxygen.nl/">Doxygen</a>. Doxygen documentation can be accessed by opening the <code>index.html</code> file in the <code>html</code> folder. This can be automatically done by running the following command in the terminal out of the <code>wizard</code> project folder: </p><div class="fragment"><div class="line">open ./html/index.html</div>
+</div><!-- fragment --> </div></div><!-- PageDoc -->
 <a href="doxygen_crawl.html"></a>
 </div><!-- contents -->
 <!-- start footer part -->
diff --git a/html/md__r_e_a_d_m_e.html b/html/md__r_e_a_d_m_e.html
index 1d5785208beb5e7fd5dabae6ee9091d281653dfe..875f3bef5827500ab06dd8d9a0d0ce7160d2cf97 100644
--- a/html/md__r_e_a_d_m_e.html
+++ b/html/md__r_e_a_d_m_e.html
@@ -88,395 +88,98 @@ $(function(){ initResizable(false); });
   <div class="headertitle"><div class="title">Software Engineering Project - Wizard</div></div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p><a class="anchor" id="autotoc_md439"></a></p>
+<div class="textblock"><p><a class="anchor" id="autotoc_md0"></a></p>
 <p>Welcome to <b><a class="el" href="class_wizard.html">Wizard</a></b>, a C++ implementation of the classic card game. Compete with your friends in exciting multiplayer gameplay!</p>
-<div style="display: flex; align-items: center;"> <img src="./assets/wizard_logo.png" alt="Wizard Logo" style="height: 150px; margin-right: 20px;" class="inline"/> <img src="./assets/cards.png" alt="Cards" style="height: 75px;" class="inline"/> </div><h1><a class="anchor" id="autotoc_md440"></a>
+<p>This project is part of the <em>Software Engineering</em> lecture at <em>ETH Zurich</em> in autumn semester 2024. By Marie Becker, Janne Berger, Martina Lehman, Aidan Meara, Michel Tarnow, and Hannah Winter.</p>
+<div style="display: flex; align-items: center;"> <img src="./assets/cards.png" alt="Cards" style="height: 200px;" class="inline"/> </div><h1><a class="anchor" id="autotoc_md1"></a>
 🚀 Features</h1>
 <ul>
 <li>🌐 <b>Multiplayer Gameplay:</b> Play with 3 to 6 players.</li>
 <li>🔄 <b>Synchronized Game State:</b> Real-time updates for all players.</li>
-<li>🖼 <b>Elegant User <a class="el" href="class_interface.html">Interface</a>:</b> A visually appealing UI powered by wxWidgets.</li>
+<li>🖼 <b>Elegant User Interface:</b> A visually appealing UI powered by wxWidgets.</li>
 </ul>
 <hr  />
-<p>You can read the game's rules <a href="https://www.amigo.games/content/ap/rule/19420--031-2019-Wizard_Manual_002_LAYOUT[1].pdf">here</a>. The implementation features a client/server architecture for multiplayer scenarios. It uses <a href="https://www.wxwidgets.org/">wxWidgets</a> for the GUI, <a href="https://github.com/fpagliughi/sockpp">sockpp</a> for the network interface, <a href="https://rapidjson.org/md_doc_tutorial.html">rapidjson</a> for object serialization, and <a href="https://github.com/google/googletest">googletest</a> for the unit tests.</p>
-<h1><a class="anchor" id="autotoc_md442"></a>
+<p>You can read the game's rules <a href="https://blog.amigo-spiele.de/content/ap/rule/06900-GB-AmigoRule.pdf">here</a>. The implementation features a client/server architecture for multiplayer scenarios. It uses <a href="https://www.wxwidgets.org/">wxWidgets</a> for the GUI, <a href="https://github.com/fpagliughi/sockpp">sockpp</a> for the network interface, <a href="https://rapidjson.org/md_doc_tutorial.html">rapidjson</a> for object serialization, and <a href="https://github.com/google/googletest">googletest</a> for the unit tests.</p>
+<hr  />
+<h1><a class="anchor" id="autotoc_md4"></a>
 1 Overview</h1>
-<p>The game and source files is available on GitLab on the main branch. The game was developed based on the provided LAMA example project game. This project consists of a <b>server</b> and a <b>client</b>, each with their own main.cpp file. Each player can run his client and connect to the server in the same local network.</p>
-<h1><a class="anchor" id="autotoc_md443"></a>
+<p>The game and source files are available on GitLab on the main branch. The game was developed based on the provided <a href="https://gitlab.ethz.ch/hraymond/cse-lama-example-project">LAMA example project</a> game. This project consists of a <b>server</b> and a <b>client</b>, each with their own main.cpp file. Each player can run their own client and connect to a server in the same local network.</p>
+<hr  />
+<h1><a class="anchor" id="autotoc_md6"></a>
 2 Compile Instructions</h1>
-<h1><a class="anchor" id="autotoc_md444"></a>
+<p>This project only works on UNIX systems (Linux / macOS). We thus only explain how to compile and run the game on these systems. The following description was tested on Ubuntu 24.04 and on macOS Sequoia.</p>
+<h2><a class="anchor" id="autotoc_md7"></a>
+2.1 Prepare OS Environment</h2>
+<p>If your OS does not yet have git installed, install git by running <code>sudo apt-get install git</code> on Ubuntu or by running <code>xcode-select --install</code> on macOS (this installs git as well). The <a class="el" href="class_wizard.html">Wizard</a> repository can then be cloned by running <code>git clone <a href="https://gitlab.ethz.ch/beckermar/wizard.git">https://gitlab.ethz.ch/beckermar/wizard.git</a></code> (clone with HTTPS) or by running <code>git clone git@gitlab.ethz.ch:beckermar/wizard.git</code> (clone with SSH) inside the directory that should contain the game. Cloning the game as a first step also makes provided scripts for preparing the OS environment and for compiling the code available.</p>
+<h3><a class="anchor" id="autotoc_md8"></a>
+2.1.1 Ubuntu 24.04</h3>
+<p>The necessary packages and software can either be installed manually or by running the provided script.</p>
+<p>To use the provided script, run <code>bash scripts/prepare_ubuntu.sh</code> inside the <b>wizard</b> directory.</p>
+<p>To manually prepare Ubuntu, execute the following commands:</p><ol type="1">
+<li><code>sudo apt-get update</code> (update package list)</li>
+<li><code>sudo apt-get install build-essential</code> (install software to build from source)</li>
+<li><code>sudo apt-get install libwxgtk3.2-dev</code> (install wxwidgets, use libwxgtk3.0-gtk3-dev on Ubuntu 20.04 / 22.04)</li>
+<li><code>sudo apt-get install cmake</code> (install cmake)</li>
+<li><code>sudo reboot</code> (reboot system)</li>
+</ol>
+<h3><a class="anchor" id="autotoc_md9"></a>
+2.1.2 macOS Sequoia</h3>
+<p>The necessary packages and software can either be installed manually or by running the provided script.</p>
+<p>To use the provided script, run <code>zsh scripts/prepare_macos.sh</code> inside the <b>wizard</b> directory.</p>
+<p>To manually prepare macOS, execute the following commands:</p><ol type="1">
+<li><code>/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</code> (install homebrew)</li>
+<li><code>brew install cmake</code> (install cmake)</li>
+<li><code>brew install wxwidgets</code> (install wxwidgets)</li>
+</ol>
+<h2><a class="anchor" id="autotoc_md10"></a>
+2.2 Compile Code</h2>
+<p>Compiling the code creates executables for the client (Wizard-client) and for the server (Wizard-server).</p>
+<h3><a class="anchor" id="autotoc_md11"></a>
+2.2.1 Ubuntu 24.04</h3>
+<p>Compiling the code can be done by running the provided script.</p>
+<p>To use the provided script, run <code>bash scripts/compile_ubuntu.sh</code> inside the <b>wizard</b> directory.</p>
+<h3><a class="anchor" id="autotoc_md12"></a>
+2.2.1 macOS Sequoia</h3>
+<p>Compiling the code can be done by running the provided script.</p>
+<p>To use the provided script, run <code>zsh scripts/compile_macos.sh</code> inside the <b>wizard</b> directory.</p>
+<hr  />
+<h1><a class="anchor" id="autotoc_md14"></a>
 3 Run the Game</h1>
-<h1><a class="anchor" id="autotoc_md445"></a>
+<p>After compiling the code, navigate into the <b>cmake-build-debug</b> directory inside the <b>wizard</b> directory. To start a server, run <code>./Wizard-server</code>. In new consoles, you can now start as many clients as you wish by running <code>./Wizard-client</code>.</p>
+<hr  />
+<h1><a class="anchor" id="autotoc_md16"></a>
 4 Play the Game</h1>
-<h2><a class="anchor" id="autotoc_md446"></a>
-4.1 Connection Panel</h2>
-<p>The client renders the GUI that is presented to the player, whereas the server is a console application without a user interface. Every action a player performs in the client application (for example playing a card) is sent as a formatted message to the server application, which processes the request. <br  />
-</p><ul>
-<li>If the <b>player's move was valid</b>, the server will update the game state (e.g. move a card from the player's hand to the discard pile) and broadcast this new game state to all players of the game. Whenever the client application receives a game state update, it will re-render the GUI accordingly and allow new interactions. <br  />
-</li>
-<li>If the <b>move was invalid</b>, the game state will not be updated and only the requesting player will get a response containing the error message.</li>
-</ul>
-<h2><a class="anchor" id="autotoc_md447"></a>
-Network Interface</h2>
-<p>Everything that is passed between client and server are objects of type <code><a class="el" href="classclient__request.html">client_request</a></code> and <code><a class="el" href="classserver__response.html">server_response</a></code>. Since the underlying network protocol works with TCP, these <code><a class="el" href="classclient__request.html">client_request</a></code> and <code><a class="el" href="classserver__response.html">server_response</a></code> objects are transformed into a <b><a href="https://wiki.selfhtml.org/wiki/JSON">JSON</a> string</b>, which can then be sent over the network. The receiving end reads the JSON string and constructs an object of type <code><a class="el" href="classclient__request.html">client_request</a></code> resp. <code><a class="el" href="classserver__response.html">server_response</a></code> that reflects the exact parameters that are specified in the JSON string. This process is known as <b>serialization</b> (object to string) and <b>deserialization</b> (string to object). If you want to read more about serialization, <a href="https://en.wikipedia.org/wiki/Serialization">read me on Wikipedia</a>.</p>
-<p><img src="./docs/img/client-server-diagram.png?raw=true" alt="client-server-diagram" class="inline"/></p>
-<h3><a class="anchor" id="autotoc_md448"></a>
-Serialization &amp; Deserialization of messages</h3>
-<p>Both, the <code><a class="el" href="classclient__request.html">client_request</a></code> and <code><a class="el" href="classserver__response.html">server_response</a></code> base classes, implement the abstract class <code>serializable</code> with its <code>write_into_json(...)</code> function. It allows to serialize the object instance into a JSON string. Additionally, they have a static function <code>from_json(...)</code>, which allows creating an object instance from a JSON string.</p>
-<div class="fragment"><div class="line"><span class="comment">// All request types of your imlementation</span></div>
-<div class="line"><span class="comment">// IMPORTANT: Add your own types here (and remove unused ones)</span></div>
-<div class="line"><span class="keyword">enum</span> RequestType {</div>
-<div class="line">    join_game,</div>
-<div class="line">    start_game,</div>
-<div class="line">    estimate_tricks,</div>
-<div class="line">    decide_trump_color,</div>
-<div class="line">    leave_game,</div>
-<div class="line">    play_card,</div>
-<div class="line">};</div>
-<div class="line"> </div>
-<div class="line"><span class="keyword">class </span><a class="code hl_class" href="classclient__request.html">client_request</a> : <span class="keyword">public</span> <a class="code hl_class" href="classserializable.html">serializable</a> {</div>
-<div class="line"><span class="keyword">protected</span>:</div>
-<div class="line">    RequestType _type;   <span class="comment">// stores the type of request, such that the receiving end knows how to deserialize it</span></div>
-<div class="line">    std::string _req_id; <span class="comment">// unique id of this request</span></div>
-<div class="line">    std::string _player_id; <span class="comment">// id of the player sending the request</span></div>
-<div class="line">    std::string _game_id;   <span class="comment">// id of the game this request is for</span></div>
-<div class="line"> </div>
-<div class="line">    ...</div>
-<div class="line">private:</div>
-<div class="line">    <span class="comment">// for deserializing RequestType (contains mappings from string to RequestType)</span></div>
-<div class="line">    <span class="comment">// IMPORTANT: Add mapping for your own RequestTypes to this unordered_map</span></div>
-<div class="line">    <span class="keyword">static</span> <span class="keyword">const</span> std::unordered_map&lt;std::string, RequestType&gt; _string_to_request_type;</div>
-<div class="line">    </div>
-<div class="line">    <span class="comment">// for serializing RequestType (contains mappings from RequestType to string)</span></div>
-<div class="line">    <span class="comment">// IMPORTANT: Add mapping for your own RequestTypes to this unordered_map</span></div>
-<div class="line">    <span class="keyword">static</span> <span class="keyword">const</span> std::unordered_map&lt;RequestType, std::string&gt; _request_type_to_string;</div>
-<div class="line"> </div>
-<div class="line"><span class="keyword">public</span>:</div>
-<div class="line">    <span class="comment">// DESERIALIZATION: Attempts to create the specific client_request from the provided json.</span></div>
-<div class="line">    <span class="keyword">static</span> <a class="code hl_class" href="classclient__request.html">client_request</a>* from_json(<span class="keyword">const</span> rapidjson::Value&amp; json);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// SERIALIZATION: Serializes the client_request into a json object that can be sent over the network</span></div>
-<div class="line">    <span class="keyword">virtual</span> <span class="keywordtype">void</span> write_into_json(rapidjson::Value&amp; json, <a class="code hl_typedef" href="class_generic_document.html#af60f06f357b8ed28b00198034cf0c1d5">rapidjson::Document::AllocatorType</a>&amp; allocator) <span class="keyword">const override</span>;</div>
-<div class="line">};</div>
-<div class="ttc" id="aclass_generic_document_html_af60f06f357b8ed28b00198034cf0c1d5"><div class="ttname"><a href="class_generic_document.html#af60f06f357b8ed28b00198034cf0c1d5">GenericDocument&lt; UTF8&lt;&gt; &gt;::AllocatorType</a></div><div class="ttdeci">RAPIDJSON_DEFAULT_ALLOCATOR AllocatorType</div><div class="ttdef"><b>Definition</b> document.h:2211</div></div>
-<div class="ttc" id="aclassclient__request_html"><div class="ttname"><a href="classclient__request.html">client_request</a></div><div class="ttdef"><b>Definition</b> client_request.h:30</div></div>
-<div class="ttc" id="aclassserializable_html"><div class="ttname"><a href="classserializable.html">serializable</a></div><div class="ttdef"><b>Definition</b> serializable.h:11</div></div>
-</div><!-- fragment --><h4><a class="anchor" id="autotoc_md449"></a>
-Serialization</h4>
-<p>When you implement your own specializations of <code><a class="el" href="classclient__request.html">client_request</a></code> (and <code><a class="el" href="classserver__response.html">server_response</a></code>, if necessary) you will have to implement the <code>write_into_json(...)</code> functions yourself. Your subclass always has to call the <code>write_into_json(...)</code> function of its base-class, such that the parameters of the base-class are written into the JSON document:</p>
-<p>Here is the <b>base-class</b> implementation: </p><div class="fragment"><div class="line"><span class="comment">// Implementation in the base-class client_request</span></div>
-<div class="line"><span class="keywordtype">void</span> client_request::write_into_json(rapidjson::Value &amp;json,</div>
-<div class="line">                                     rapidjson::MemoryPoolAllocator&lt;rapidjson::CrtAllocator&gt; &amp;allocator)<span class="keyword"> const </span>{</div>
-<div class="line">    <span class="comment">// Look up string value of this client_request&#39;s RequestType and store it in the json document</span></div>
-<div class="line">    rapidjson::Value type_val(_request_type_to_string.at(this-&gt;_type).c_str(), allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;type&quot;</span>, type_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// Save player_id in the JSON document</span></div>
-<div class="line">    rapidjson::Value player_id_val(_player_id.c_str(), allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;player_id&quot;</span>, player_id_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// Save game_id in the JSON document</span></div>
-<div class="line">    rapidjson::Value game_id_val(_game_id.c_str(), allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;game_id&quot;</span>, game_id_val, allocator);</div>
-<div class="line">    ...</div>
-<div class="line">}</div>
-</div><!-- fragment --><p> And here is the <b>subclass</b> implementation (for the <code><a class="el" href="classplay__card__request.html">play_card_request</a></code> class), where an additional field <code>_card_id</code> is serialized. </p><div class="fragment"><div class="line"><span class="comment">// Implementation in the subclass play_card_request </span></div>
-<div class="line"><span class="keywordtype">void</span> play_card_request::write_into_json(rapidjson::Value &amp;json,</div>
-<div class="line">                                        rapidjson::MemoryPoolAllocator&lt;rapidjson::CrtAllocator&gt; &amp;allocator)<span class="keyword"> const </span>{</div>
-<div class="line">    <span class="comment">// IMPORTANT: call base-class, such that the parameters of the base-class are written into the &#39;json&#39; variable</span></div>
-<div class="line">    client_request::write_into_json(json, allocator);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// Add parameters to the JSON that are unique to the play_card_request</span></div>
-<div class="line">    rapidjson::Value card_id_val(_card_id.c_str(), allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;card_id&quot;</span>, card_id_val,allocator);</div>
-<div class="line">}</div>
-</div><!-- fragment --><h4><a class="anchor" id="autotoc_md450"></a>
-Deserialization</h4>
-<p>The deserialization of <code><a class="el" href="classclient__request.html">client_request</a></code> JSONs always goes through the <code>from_json(...)</code> function of the <code><a class="el" href="classclient__request.html">client_request</a></code> class. In this function, the "type" field, stored in the JSON, is inspected to determine, which subclass should be called to perform the deserialization:</p>
-<div class="fragment"><div class="line"><span class="keywordflow">if</span> (json.HasMember(<span class="stringliteral">&quot;type&quot;</span>) &amp;&amp; json[<span class="stringliteral">&quot;type&quot;</span>].IsString()) {</div>
-<div class="line">        <span class="comment">// Get the RequestType stored as a string in the JSON</span></div>
-<div class="line">        <span class="keyword">const</span> std::string type = json[<span class="stringliteral">&quot;type&quot;</span>].GetString();</div>
-<div class="line">        <span class="comment">// Lookup the actual RequestType per string from a pre-defined unordered_map</span></div>
-<div class="line">        <span class="keyword">const</span> RequestType request_type = client_request::_string_to_request_type.at(type);</div>
-<div class="line"> </div>
-<div class="line">        <span class="comment">// Call the correct from_json() specialization</span></div>
-<div class="line">        <span class="keywordflow">if</span> (request_type == RequestType::play_card) {</div>
-<div class="line">            <span class="keywordflow">return</span> play_card_request::from_json(json);</div>
-<div class="line">        }</div>
-<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (request_type == RequestType::draw_card) {</div>
-<div class="line">            <span class="keywordflow">return</span> draw_card_request::from_json(json);</div>
-<div class="line">        }</div>
-<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (...) {</div>
-<div class="line">            ...</div>
-<div class="line">        } <span class="keywordflow">else</span> {</div>
-<div class="line">            <span class="keywordflow">throw</span> <a class="code hl_class" href="class_wizard_exception.html">WizardException</a>(<span class="stringliteral">&quot;Encountered unknown ClientRequest type &quot;</span> + type);</div>
-<div class="line">        }</div>
-<div class="line">    }</div>
-<div class="line">    <span class="keywordflow">throw</span> <a class="code hl_class" href="class_wizard_exception.html">WizardException</a>(<span class="stringliteral">&quot;Could not determine type of ClientRequest. JSON was:\n&quot;</span> + json_utils::to_string(&amp;json));</div>
-<div class="ttc" id="aclass_wizard_exception_html"><div class="ttname"><a href="class_wizard_exception.html">WizardException</a></div><div class="ttdef"><b>Definition</b> WizardException.h:10</div></div>
-</div><!-- fragment --><p>Therefore, when you implement your own <code><a class="el" href="classclient__request.html">client_request</a></code> subclasses, remember to add a new element into the <code>RequestType</code> enum to define your new request type. You will also have to add an entry for this new RequestType in the two unordered_maps <code>_string_to_request_type</code>, resp. <code>_request_type_to_string</code> in the <code><a class="el" href="classclient__request.html">client_request</a></code> base-class. Once this is done, you can add a check for your new <code>RequestType</code> element in the <code>from_json(...)</code> function of the <code><a class="el" href="classclient__request.html">client_request</a></code> base-class and call the specialized <code>from_json(...)</code> function of your subclass from there.</p>
-<p>Also, don't forget to set the correct <code>RequestType</code> in the public constructor of your new <code><a class="el" href="classclient__request.html">client_request</a></code> subclass, here examplified at the <code><a class="el" href="classplay__card__request.html">play_card_request</a></code> class:</p>
-<div class="fragment"><div class="line"><span class="comment">// Public constructor</span></div>
-<div class="line">play_card_request::play_card_request(std::string game_id, std::string player_id, std::string card_id)</div>
-<div class="line">        : <a class="code hl_class" href="classclient__request.html">client_request</a>(<a class="code hl_class" href="classclient__request.html">client_request</a>::create_base_class_properties(  <span class="comment">// call base-class constructor</span></div>
-<div class="line">                                                    RequestType::play_card, <span class="comment">// IMPORTANT: set the RequestType of your subclass</span></div>
-<div class="line">                                                    <a class="code hl_class" href="classuuid__generator.html">uuid_generator</a>::generate_uuid_v4(), </div>
-<div class="line">                                                    player_id, </div>
-<div class="line">                                                    game_id) ),</div>
-<div class="line">        _card_id(card_id)   <span class="comment">// set subclass specific parameters</span></div>
-<div class="line">{ }</div>
-<div class="ttc" id="aclassuuid__generator_html"><div class="ttname"><a href="classuuid__generator.html">uuid_generator</a></div><div class="ttdef"><b>Definition</b> uuid_generator.h:13</div></div>
-</div><!-- fragment --><p>The deserialization in your subclass will look something like this:</p>
-<div class="fragment"><div class="line"><span class="comment">// private constructor for deserialization</span></div>
-<div class="line">play_card_request::play_card_request(<a class="code hl_struct" href="structclient__request_1_1base__class__properties.html">client_request::base_class_properties</a> props, std::string card_id) :</div>
-<div class="line">        <a class="code hl_class" href="classclient__request.html">client_request</a>(props),  <span class="comment">// call base-class constructor</span></div>
-<div class="line">        _card_id(card_id)   <span class="comment">// set subclass specific parameters</span></div>
-<div class="line">{ }</div>
-<div class="line"> </div>
-<div class="line"><span class="comment">// Deserialization</span></div>
-<div class="line"><a class="code hl_class" href="classplay__card__request.html">play_card_request</a>* play_card_request::from_json(<span class="keyword">const</span> rapidjson::Value&amp; json) {</div>
-<div class="line">    <span class="comment">// extract base-class properties from the json</span></div>
-<div class="line">    base_class_properties props = client_request::extract_base_class_properties(json);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// get subclass specific properties</span></div>
-<div class="line">    <span class="keywordflow">if</span> (json.HasMember(<span class="stringliteral">&quot;card_id&quot;</span>)) {</div>
-<div class="line">        <span class="comment">// invoke deserialization constructor</span></div>
-<div class="line">        <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code hl_class" href="classplay__card__request.html">play_card_request</a>(props, json[<span class="stringliteral">&quot;card_id&quot;</span>].GetString());</div>
-<div class="line">    } <span class="keywordflow">else</span> {</div>
-<div class="line">        <span class="keywordflow">throw</span> <a class="code hl_class" href="class_wizard_exception.html">WizardException</a>(<span class="stringliteral">&quot;Could not find &#39;card_id&#39; in play_card_request&quot;</span>);</div>
-<div class="line">    }</div>
-<div class="line">}</div>
-<div class="ttc" id="aclassplay__card__request_html"><div class="ttname"><a href="classplay__card__request.html">play_card_request</a></div><div class="ttdef"><b>Definition</b> play_card_request.h:13</div></div>
-<div class="ttc" id="astructclient__request_1_1base__class__properties_html"><div class="ttname"><a href="structclient__request_1_1base__class__properties.html">client_request::base_class_properties</a></div><div class="ttdef"><b>Definition</b> client_request.h:33</div></div>
-</div><!-- fragment --><p>There are plenty of examples of subclasses in the network/requests folder, where you can see how the serialization/deserialization scheme works.</p>
-<h3><a class="anchor" id="autotoc_md451"></a>
-4.2.2 Sending messages</h3>
-<h3><a class="anchor" id="autotoc_md452"></a>
-Client -&gt; Server:</h3>
-<p>All you have to do is use the static class <code><a class="el" href="class_client_network_manager.html">ClientNetworkManager</a></code> on the client side and then invoke its <code>sendRequest(const <a class="el" href="classclient__request.html">client_request</a>&amp; request)</code> function with the <code><a class="el" href="classclient__request.html">client_request</a></code> that you want to send. The server's response will arrive as an object of type <code><a class="el" href="classrequest__response.html">request_response</a></code> and the <code><a class="el" href="class_client_network_manager.html">ClientNetworkManager</a></code> will invoke the <code>Process()</code> function of that <code><a class="el" href="classrequest__response.html">request_response</a></code> object automatically.</p>
-<h3><a class="anchor" id="autotoc_md453"></a>
-Server -&gt; Client:</h3>
-<p>All messages arriving at the server are being deserialized and then passed on to the <code>handle_request(client_request* req)</code> function of the <code><a class="el" href="classrequest__handler.html">request_handler</a></code> singleton class. This function returns a pointer to an object of type <code><a class="el" href="classrequest__response.html">request_response</a></code> (a subclass of <code><a class="el" href="classserver__response.html">server_response</a></code>), which is then automatically sent back to the requesting client. In your game implementation you should extend the <code>handle_request(client_request* req)</code> function of the <code><a class="el" href="classrequest__handler.html">request_handler</a></code>, such that it can handle the <code><a class="el" href="classclient__request.html">client_request</a></code> that you add to your game and return an object of type <code><a class="el" href="classrequest__response.html">request_response</a></code> with all parameters you want to send.</p>
-<p>If the <code><a class="el" href="classclient__request.html">client_request</a></code> causes an update of the <a class="el" href="classgame__state.html">game_state</a> you should also update all other players of that game about the <a class="el" href="classgame__state.html">game_state</a> change. This happens in the <code><a class="el" href="classgame__instance.html">game_instance</a></code> class, here examplified at the case where a <code><a class="el" href="classstart__game__request.html">start_game_request</a></code> calls the <code>start_game(...)</code> function on the respective <code><a class="el" href="classgame__instance.html">game_instance</a></code> on the server side:</p>
-<div class="fragment"><div class="line"><span class="keywordtype">bool</span> game_instance::start_game(<a class="code hl_class" href="classplayer.html">player</a>* <a class="code hl_class" href="classplayer.html">player</a>, std::string &amp;err) {</div>
-<div class="line">    modification_lock.lock();   <span class="comment">// make sure only one request can modify the game_state at a time</span></div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// Try to start the game</span></div>
-<div class="line">    <span class="keywordflow">if</span> (_game_state-&gt;start_game(err)) { </div>
-<div class="line">        <span class="comment">// create a full_state_response (subclass of server_response) with the full game_state inside</span></div>
-<div class="line">        <a class="code hl_class" href="classfull__state__response.html">full_state_response</a> state_update_msg = <a class="code hl_class" href="classfull__state__response.html">full_state_response</a>(this-&gt;get_id(), *_game_state);</div>
-<div class="line">        <span class="comment">// BROADCAST new game_state to all other players</span></div>
-<div class="line">        server_network_manager::broadcast_message(state_update_msg, _game_state-&gt;get_players(), <a class="code hl_class" href="classplayer.html">player</a>);</div>
-<div class="line"> </div>
-<div class="line">        modification_lock.unlock(); <span class="comment">// allow other threads to modify the game_state</span></div>
-<div class="line">        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line">    }</div>
-<div class="line">    modification_lock.unlock();</div>
-<div class="line">    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line">}</div>
-<div class="ttc" id="aclassfull__state__response_html"><div class="ttname"><a href="classfull__state__response.html">full_state_response</a></div><div class="ttdef"><b>Definition</b> full_state_response.h:11</div></div>
-<div class="ttc" id="aclassplayer_html"><div class="ttname"><a href="classplayer.html">player</a></div><div class="ttdef"><b>Definition</b> player.h:11</div></div>
-</div><!-- fragment --><h3><a class="anchor" id="autotoc_md454"></a>
-4.2.3 Debugging Messages</h3>
-<p>By default, the server (specifically, the <a class="el" href="classserver__network__manager.html">server_network_manager</a>) will print every valid message that it receives to the console. In order for this to work in your project as well, you have to make sure that your CMake file contains a line, where the preprocessor variable PRINT_NETWORK_MESSAGES is defined for your server executable.</p>
-<div class="fragment"><div class="line">target_compile_definitions(Wizard-server PRIVATE PRINT_NETWORK_MESSAGES=1)</div>
-</div><!-- fragment --><p>If a wrongly formatted message arrives at the server, it will print an error message with the received message string to the console, no matter if PRINT_NETWORK_MESSAGES is defined or not.</p>
-<p>If you want to manually print one of your serialized messages (or any other serialized object for that matter), you can use the helper function <code>json_utils::to_string(const rapidjson::Value* json)</code> as follows.</p>
-<div class="fragment"><div class="line"><span class="preprocessor">#include &quot;src/common/serialization/json_utils.h&quot;</span></div>
-<div class="line"><span class="preprocessor">#include &quot;<a class="code" href="document_8h.html">rapidjson/include/rapidjson/document.h</a>&quot;</span></div>
-<div class="line"> </div>
-<div class="line">...</div>
-<div class="line"><span class="comment">// Create a request to serialize</span></div>
-<div class="line">join_game_request* req = <span class="keyword">new</span> <a class="code hl_class" href="classjoin__game__request.html">join_game_request</a>(<a class="code hl_class" href="classplayer.html">player</a>-&gt;get_id(), <a class="code hl_class" href="classplayer.html">player</a>-&gt;get_player_name());</div>
-<div class="line"> </div>
-<div class="line"><span class="comment">// serialize the request object</span></div>
-<div class="line">rapidjson::Document* req_json = req-&gt;to_json();</div>
-<div class="line"> </div>
-<div class="line"><span class="comment">// print serialization to the console.</span></div>
-<div class="line">std::cout &lt;&lt; json_utils::to_string(req_json) &lt;&lt; std::endl;</div>
-<div class="ttc" id="aclassjoin__game__request_html"><div class="ttname"><a href="classjoin__game__request.html">join_game_request</a></div><div class="ttdef"><b>Definition</b> join_game_request.h:13</div></div>
-<div class="ttc" id="adocument_8h_html"><div class="ttname"><a href="document_8h.html">document.h</a></div></div>
-</div><!-- fragment --><h2><a class="anchor" id="autotoc_md455"></a>
-4.3 Game State</h2>
-<p>The <code><a class="el" href="classgame__state.html">game_state</a></code> class stores all parameters that are required to represent the game on the client (resp. server) side. In order to synchronize this <code><a class="el" href="classgame__state.html">game_state</a></code> among all players, the <code><a class="el" href="classgame__state.html">game_state</a></code> can also be <b>serialized</b> and <b>deserialized</b>. If a <code><a class="el" href="classclient__request.html">client_request</a></code> was successfully executed on the server, then the <code><a class="el" href="classrequest__response.html">request_response</a></code> that is sent back to the client contains a serialized version of the updated <code><a class="el" href="classgame__state.html">game_state</a></code>. All other players receive the updated <code><a class="el" href="classgame__state.html">game_state</a></code> at the same time through a <code><a class="el" href="classfull__state__response.html">full_state_response</a></code>.</p>
-<p>To serialize the <code><a class="el" href="classgame__state.html">game_state</a></code>, the same <code>write_into_json(...)</code> function is used as for the <code><a class="el" href="classclient__request.html">client_request</a></code>.</p>
-<div class="fragment"><div class="line"><span class="keyword">class </span><a class="code hl_class" href="classgame__state.html">game_state</a> : <span class="keyword">public</span> <a class="code hl_class" href="classunique__serializable.html">unique_serializable</a> {</div>
-<div class="line"><span class="keyword">private</span>:</div>
-<div class="line">    <span class="comment">// Properties</span></div>
-<div class="line">    std::vector&lt;player*&gt; _players;</div>
-<div class="line">    draw_pile* _draw_pile;</div>
-<div class="line">    discard_pile* _discard_pile;</div>
-<div class="line">    <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;</a>* _is_started;</div>
-<div class="line">    <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;</a>* _is_finished;</div>
-<div class="line">    <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* _round_number;</div>
-<div class="line">    <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* _current_player_idx;</div>
-<div class="line">    <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* _starting_player_idx;</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// deserialization constructor</span></div>
-<div class="line">    <a class="code hl_class" href="classgame__state.html">game_state</a>(</div>
-<div class="line">            std::string <span class="keywordtype">id</span>,</div>
-<div class="line">            draw_pile* draw_pile,</div>
-<div class="line">            discard_pile* discard_pile,</div>
-<div class="line">            std::vector&lt;player*&gt;&amp; players,</div>
-<div class="line">            <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;</a>* is_started,</div>
-<div class="line">            <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;</a>* is_finished,</div>
-<div class="line">            <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* current_player_idx,</div>
-<div class="line">            <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* round_number,</div>
-<div class="line">            <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* starting_player_idx);</div>
-<div class="line"> </div>
-<div class="line"><span class="keyword">public</span>:</div>
-<div class="line">    <a class="code hl_class" href="classgame__state.html">game_state</a>();</div>
-<div class="line"> </div>
-<div class="line">    ...</div>
-<div class="line">    <span class="comment">// SERIALIZATION</span></div>
-<div class="line">    <span class="keyword">virtual</span> <span class="keywordtype">void</span> write_into_json(rapidjson::Value&amp; json, <a class="code hl_typedef" href="class_generic_document.html#af60f06f357b8ed28b00198034cf0c1d5">rapidjson::Document::AllocatorType</a>&amp; allocator) <span class="keyword">const override</span>;</div>
-<div class="line">    <span class="comment">// DESERIALIZATION</span></div>
-<div class="line">    <span class="keyword">static</span> <a class="code hl_class" href="classgame__state.html">game_state</a>* from_json(<span class="keyword">const</span> rapidjson::Value&amp; json);</div>
-<div class="line">};</div>
-<div class="ttc" id="aclassgame__state_html"><div class="ttname"><a href="classgame__state.html">game_state</a></div><div class="ttdef"><b>Definition</b> game_state.h:18</div></div>
-<div class="ttc" id="aclassserializable__value_html"><div class="ttname"><a href="classserializable__value.html">serializable_value</a></div><div class="ttdef"><b>Definition</b> serializable_value.h:27</div></div>
-<div class="ttc" id="aclassunique__serializable_html"><div class="ttname"><a href="classunique__serializable.html">unique_serializable</a></div><div class="ttdef"><b>Definition</b> unique_serializable.h:12</div></div>
-</div><!-- fragment --><p>The <code><a class="el" href="classgame__state.html">game_state</a></code> inherits from <code><a class="el" href="classunique__serializable.html">unique_serializable</a></code>, which essentially requires the <code>write_into_json()</code> function and adds a unique <code>id</code> to the object, such that it can be uniquely identified. Similarly, each parameter nested inside the <code><a class="el" href="classgame__state.html">game_state</a></code> (e.g. players, draw_pile, etc.) also inherit from <code><a class="el" href="classunique__serializable.html">unique_serializable</a></code> and therefore have their own <code>id</code> and serialization, resp. deserialization functions.</p>
-<p>On the client side, the new <code><a class="el" href="classgame__state.html">game_state</a></code> is then passed to the <code>updateGameState(game_state*)</code> function of the <code><a class="el" href="class_game_controller.html">GameController</a></code> class, which performs a redraw of the GUI.</p>
-<p>Since you will have to add your own properties to the <code><a class="el" href="classgame__state.html">game_state</a></code> class (and probably create other classes that inherit from <code><a class="el" href="classunique__serializable.html">unique_serializable</a></code> to add to your <a class="el" href="classgame__state.html">game_state</a>), we want to shortly elaborate how the serialization and deserialization works for subclasses of <code><a class="el" href="classunique__serializable.html">unique_serializable</a></code>. It's very similar to the <code><a class="el" href="classclient__request.html">client_request</a></code> class discussed earlier. Here is how the <code>write_into_json(...)</code> function is implemented in the <code><a class="el" href="classgame__state.html">game_state</a></code> class of <a class="el" href="class_wizard.html">Wizard</a>. <b>Don't be shocked by the lengthy code. It's only a lot of repetition for each class property</b> :</p>
-<div class="fragment"><div class="line"><span class="keywordtype">void</span> game_state::write_into_json(rapidjson::Value &amp;json,</div>
-<div class="line">                                 rapidjson::MemoryPoolAllocator&lt;rapidjson::CrtAllocator&gt; &amp;allocator)<span class="keyword"> const </span>{</div>
-<div class="line">    <span class="comment">// call base-class to write id and object name into the json</span></div>
-<div class="line">    unique_serializable::write_into_json(json, allocator);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// write all properties of this game_state instance into the JSON</span></div>
-<div class="line">    rapidjson::Value is_finished_val(rapidjson::kObjectType);   <span class="comment">// create an empty rapidjson::Value that can hold an ObjectType</span></div>
-<div class="line">    _is_finished-&gt;write_into_json(is_finished_val, allocator);  <span class="comment">// write class property &#39;_is_finished&#39; into the created rapidjson::Value</span></div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;is_finished&quot;</span>, is_finished_val, allocator);  <span class="comment">// add the rapidjson::Value &#39;is_finished_val&#39; to the game_state json</span></div>
-<div class="line"> </div>
-<div class="line">    rapidjson::Value is_started_val(rapidjson::kObjectType);</div>
-<div class="line">    _is_started-&gt;write_into_json(is_started_val, allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;is_started&quot;</span>, is_started_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    rapidjson::Value current_player_idx_val(rapidjson::kObjectType);</div>
-<div class="line">    _current_player_idx-&gt;write_into_json(current_player_idx_val, allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;current_player_idx&quot;</span>, current_player_idx_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    rapidjson::Value starting_player_idx_val(rapidjson::kObjectType);</div>
-<div class="line">    _starting_player_idx-&gt;write_into_json(starting_player_idx_val, allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;starting_player_idx&quot;</span>, starting_player_idx_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    rapidjson::Value round_number_val(rapidjson::kObjectType);</div>
-<div class="line">    _round_number-&gt;write_into_json(round_number_val, allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;round_number&quot;</span>, round_number_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    rapidjson::Value draw_pile_val(rapidjson::kObjectType);</div>
-<div class="line">    _draw_pile-&gt;write_into_json(draw_pile_val, allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;draw_pile&quot;</span>, draw_pile_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    rapidjson::Value discard_pile_val(rapidjson::kObjectType);</div>
-<div class="line">    _discard_pile-&gt;write_into_json(discard_pile_val, allocator);</div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;discard_pile&quot;</span>, discard_pile_val, allocator);</div>
-<div class="line"> </div>
-<div class="line">    <span class="comment">// Special helper function to serialize vector of pointers</span></div>
-<div class="line">    <span class="comment">// The pointers inside the vector have to inherit from serializable (or unique_serializable)</span></div>
-<div class="line">    json.AddMember(<span class="stringliteral">&quot;players&quot;</span>, vector_utils::serialize_vector(_players, allocator), allocator);</div>
-<div class="line">}</div>
-</div><!-- fragment --><p>For <b>deserialization</b>, the <code>from_json(...)</code> function is used, which is implemented as follows:</p>
-<div class="fragment"><div class="line"><span class="comment">// DESERIALIZATION CONSTRUCTOR receives pointers for all its properties and stores them</span></div>
-<div class="line">game_state::game_state(std::string <span class="keywordtype">id</span>, draw_pile *draw_pile, discard_pile *discard_pile,</div>
-<div class="line">                       std::vector&lt;player *&gt; &amp;players, <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;</a> *is_started,</div>
-<div class="line">                       <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;</a> *is_finished, <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a> *current_player_idx,</div>
-<div class="line">                       <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a>* round_number, <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;</a> *starting_player_idx)</div>
-<div class="line">        : <a class="code hl_class" href="classunique__serializable.html">unique_serializable</a>(id),  <span class="comment">// initialize the unique_serializable base-class</span></div>
-<div class="line">          _draw_pile(draw_pile),</div>
-<div class="line">          _discard_pile(discard_pile),</div>
-<div class="line">          _players(players),</div>
-<div class="line">          _is_started(is_started),</div>
-<div class="line">          _is_finished(is_finished),</div>
-<div class="line">          _current_player_idx(current_player_idx),</div>
-<div class="line">          _round_number(round_number),</div>
-<div class="line">          _starting_player_idx(starting_player_idx)</div>
-<div class="line">{ }</div>
-<div class="line"> </div>
-<div class="line"><span class="comment">// DESERIALIZATION </span></div>
-<div class="line"><span class="comment">// returns a pointer to the new game_state</span></div>
-<div class="line"><a class="code hl_class" href="classgame__state.html">game_state</a>* game_state::from_json(<span class="keyword">const</span> rapidjson::Value &amp;json) {</div>
-<div class="line">    <span class="comment">// Make sure the json contains all required information</span></div>
-<div class="line">    <span class="keywordflow">if</span> (json.HasMember(<span class="stringliteral">&quot;is_finished&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;is_started&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;current_player_idx&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;round_number&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;starting_player_idx&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;players&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;draw_pile&quot;</span>)</div>
-<div class="line">        &amp;&amp; json.HasMember(<span class="stringliteral">&quot;discard_pile&quot;</span>))</div>
-<div class="line">    {</div>
-<div class="line">        <span class="comment">// deserialize all players</span></div>
-<div class="line">        std::vector&lt;player*&gt; deserialized_players;</div>
-<div class="line">        <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;serialized_player : json[<span class="stringliteral">&quot;players&quot;</span>].GetArray()) {</div>
-<div class="line">            deserialized_players.push_back(player::from_json(serialized_player.GetObject()));</div>
-<div class="line">        }</div>
-<div class="line">        <span class="comment">// Invoke deserialization constructor</span></div>
-<div class="line">        <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code hl_class" href="classgame__state.html">game_state</a>(unique_serializable::extract_id(json),   <span class="comment">// extract base_params from JSON</span></div>
-<div class="line">                              draw_pile::from_json(json[<span class="stringliteral">&quot;draw_pile&quot;</span>].GetObject()),  <span class="comment">// deserialize the draw_pile</span></div>
-<div class="line">                              discard_pile::from_json(json[<span class="stringliteral">&quot;discard_pile&quot;</span>].GetObject()),</div>
-<div class="line">                              deserialized_players,</div>
-<div class="line">                              <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;::from_json</a>(json[<span class="stringliteral">&quot;is_started&quot;</span>].GetObject()),</div>
-<div class="line">                              <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;bool&gt;::from_json</a>(json[<span class="stringliteral">&quot;is_finished&quot;</span>].GetObject()),</div>
-<div class="line">                              <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;::from_json</a>(json[<span class="stringliteral">&quot;current_player_idx&quot;</span>].GetObject()),</div>
-<div class="line">                              <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;::from_json</a>(json[<span class="stringliteral">&quot;round_number&quot;</span>].GetObject()),</div>
-<div class="line">                              <a class="code hl_class" href="classserializable__value.html">serializable_value&lt;int&gt;::from_json</a>(json[<span class="stringliteral">&quot;starting_player_idx&quot;</span>].GetObject()));</div>
-<div class="line">    } <span class="keywordflow">else</span> {</div>
-<div class="line">        <span class="keywordflow">throw</span> <a class="code hl_class" href="class_wizard_exception.html">WizardException</a>(<span class="stringliteral">&quot;Failed to deserialize game_state. Required entries were missing.&quot;</span>);</div>
-<div class="line">    }</div>
-<div class="line">}</div>
-</div><!-- fragment --><p>A similar scheme is applied in all other objects that inherit from <code><a class="el" href="classunique__serializable.html">unique_serializable</a></code>. Namely, these are:</p><ul>
-<li><code>player</code></li>
-<li><code>hand</code></li>
-<li><code>card</code></li>
-<li><code>draw_pile</code></li>
-<li><code>discard_pile</code></li>
-<li><code><a class="el" href="classserializable__value.html">serializable_value</a></code></li>
-</ul>
-<h2><a class="anchor" id="autotoc_md456"></a>
-4.4 GUI with wxWidgets</h2>
-<p>The GUI of the example project was built using the cross-platform GUI library <a href="https://www.wxwidgets.org/">wxWidgets</a>. In order to build a project using wxWidget elements, you will first need to install wxWidgets on your system (see Section 1.1 above).</p>
-<h3><a class="anchor" id="autotoc_md457"></a>
-4.4.1 Structure &amp; Important Classes</h3>
-<p>Here is a list of the most important elements that you will need to create your GUI. This is just meant as an overview, you will need to look up their correct usage in wxWidget's <a href="https://docs.wxwidgets.org/3.0/index.html">documentation</a>.</p>
-<ul>
-<li><b>Application core</b><ul>
-<li><b><code>wxIMPLEMENT_APP()</code></b>: In order to properly interact with the operating system's GUI, wxWidgets takes over the control flow of your application. wxWidgets therefore has its own <code>main()</code> function, that you can reference with the macro <code>wxIMPLEMENT_APP(wxApp*)</code>.</li>
-<li><b><code>wxApp</code></b>: The core class of your application must inherit from the <code>wxApp</code> class. wxWidgets will call the <code>OnInit()</code> function when starting the application. You can find the example project's implementation in <code>src/client/app/Wizard</code>.</li>
-</ul>
-</li>
-<li><b>Windows</b><ul>
-<li><b><code>wxFrame</code></b>: Each window of your application must inherit from the <code>wxFrame</code> class. The example project has one window which you can find here: <code>src/client/windows/GameWindow</code></li>
-</ul>
-</li>
-<li><b>GUI elements</b><ul>
-<li><b><code>wxPanel</code></b>: Panels serve as containers for elements within a window. All panels must instantiate or inherit from the <code>wxPanel</code> class. A panel can contain one or more subpanels.</li>
-<li><b><code>wxBoxSizer</code></b>: <a class="el" href="class_box.html">Box</a> sizers allow you to layout your panels within a window, either horizontally or vertically. By nesting box sizers, you can create complex layouts. Have a look at <code>src/client/panels/ConnectionPanel</code> for an example.</li>
-<li><b><code>wxStaticText</code></b>: This class displays text in your GUI.</li>
-<li><b><code>wxButton</code></b>: This class creates a clickable button in your GUI.</li>
-</ul>
-</li>
-<li><b>Pop-ups</b><ul>
-<li><b><code>wxMessageBox()</code></b>: You can use this function to display a small pop-up window with text in front of the your current main window. This is useful to display error or status messages.</li>
-</ul>
-</li>
-</ul>
-<h3><a class="anchor" id="autotoc_md458"></a>
-4.4.2 Events</h3>
-<p>Like in most GUI environments, objects in wxWidgets trigger <b>events</b> when they are interacted with by the user. For instance, a button will trigger a <code>wxEVT_BUTTON</code> event when clicked. Similarly, a panel will trigger a <code>wxEVT_LEFT_UP</code> event when clicked. There are many other events that can be triggered - for example when a keyboard key is pressed, when a window is resized, or when the cursor moves over an element.</p>
-<p>In order to make the GUI interactive, we must specify the effect of an event. The easiest way is to <b>bind</b> an event to a lambda function. A lambda function is an unnamed function that can be used as an r-value. In C++, lambda functions have the following syntax:</p>
-<div class="fragment"><div class="line">[ external_variables... ]( function_parameters ... ) {</div>
-<div class="line">    function_body...</div>
-<div class="line">}</div>
-</div><!-- fragment --><p>Here is an example which binds a lambda function to a button click event:</p>
-<div class="fragment"><div class="line">wxButton* myButton = new wxButton(parentPanel, wxID_ANY, &quot;Click me!&quot;);</div>
-<div class="line">int myVariable = 42;</div>
-<div class="line">myButton-&gt;Bind(wxEVT_BUTTON, [myVariable](wxCommandEvent&amp; event) {</div>
-<div class="line">    doSomething(myVariable, event);</div>
-<div class="line">});</div>
-</div><!-- fragment --><p>In C++, we need to specify which variables from outside the lambda function's scope should be accessible within it. In the example above, <code>myVariable</code> is declared outside of the lambda function but is used by the <code>doSomething()</code> function call within the lambda function. We must therefore list <code>myVariable</code> within the square brackets at the beginning of the lambda function definition, in order to make it accessible from within the lambda function's scope. </p>
-</div></div><!-- contents -->
+<p>Once a client is started, the connection panel shows up. Here every player can enter the server address and port (in most cases the default input can be left unchanged), as well as their player name. If the player name chosen already exists in the game, a number will be automatically added to the name. Next to these input fields, a <em>Rules</em> button is shown on the bottom right of the screen. The button will be shown throughout the whole game and can be clicked to access the rules whenever needed.</p>
+<p><img src="/assets/readme/connection_panel.png" alt="Connection panel" width="50%" height="50%" class="inline"/> <br  />
+</p>
+<p>After clicking on the <em>Connect</em> button, the lobby shows up. Here all players that have joined the game can be seen. The <em>Start Game</em> button can be clicked to start a game once enough players joined, and the <em>Leave Game</em> button can be clicked to leave the game. This is possible throughout the whole game, however, if a player leaves the game after it has started, the game is over.</p>
+<p><img src="assets/readme/lobby_one_player.png" alt="Lobby panel" width="50%" height="50%" class="inline"/> <br  />
+</p>
+<p>To start a game, at least 3 players have to connect to the server and join the game. The maximum number of players per game is 6. Once at least 3 players are connected to the server and have joined the game, the <em>Start Game</em> button turns purple and the game can be started by clicking the button.</p>
+<p>If players decide throughout the waiting time that they want to leave the game again, they can press the <em>Leave Game</em> button and leave the Lobby. The player will be removed from the Lobby and the other players can keep waiting.</p>
+<p><img src="assets/readme/lobby_six_players.png" alt="Lobby panel" width="50%" height="50%" class="inline"/> <br  />
+</p>
+<p>Every round starts with an estimation phase. Here each player can enter their trick estimation by typing into the provided input filed, and then submit it by clicking on the <em>Submit</em> button. In this phase of the game, each player can see their own cards shown at the bottom and the trump card shown on the left side of the screen. The current round number and the sum of already submitted trick estimations in shown in the middle of the screen and can help players submitting a valid estimate (e.g., estimate cannot be greater than the current round number).</p>
+<p>Above the <em>Leave Game</em> button, the scoreboard can now be accessed by clicking on the <em>Scoreboard</em> button. The scoreboard is available throughout the whole game and winning and loosing players are color-coded. If a player leaves the game now after it was already started, the game ends immediately for all players and the final scores are shown to everyone.</p>
+<p><img src="assets/readme/estimation_panel.png" alt="Estimation phase" width="50%" height="50%" class="inline"/> <br  />
+</p>
+<p>After every player has submitted their estimation, the playing phase starts. Cards can be played by clicking on the respective card. Hovering over cards increases their size to get a closer look. An announcement in the middle of the screen shows whose turn it is. The player whose turn it is, is also highlighted in purple. Played cards are displayed in the middle of the screen as well and in the top left corner the round number and the sum of estimated tricks are shown. Below each players' name, the won and predicted numbers of tricks can be seen.</p>
+<p><img src="assets/readme/play_phase_last_player.png" alt="Play phase" width="50%" height="50%" class="inline"/> <br  />
+</p>
+<p>At the end of each trick, the winner is shown and the new trick starts automatically. If the trick is the last trick of a round, also the points gained or lost in this round are shown, and the new round starts automatically. At the end of the game, the winner is announced and the players can close the game.</p>
+<p>Have fun playing!</p>
+<h1><a class="anchor" id="autotoc_md17"></a>
+Play on different devices</h1>
+<p>When playing the game on a single device, the default server address <em>127.0.0.1</em> and server port <em>50505</em> can be used during the connection phase.</p>
+<p>However, the game can also be played from different devices on the same wifi network 🛜 or if all devices are connected to the same VPN. In this case one player needs to host the server, while all other players only run a client. When connecting to the game, all players have to enter the private IP address of the player hosting the server in the <em>server address</em> field. The default port <em>50505</em> can be kept.</p>
+<h2><a class="anchor" id="autotoc_md18"></a>
+Get local IP address to host server</h2>
+<p>On macOS version 10.4 throughout the latest version run the following command in the terminal: </p><div class="fragment"><div class="line">ipconfig getifaddr en0</div>
+</div><!-- fragment --><p> On Ubuntu 24.04 you can use the <code>hostname</code> command in the terminal: </p><div class="fragment"><div class="line">hostname -I</div>
+</div><!-- fragment --><h1><a class="anchor" id="autotoc_md19"></a>
+Find Coding Documentation</h1>
+<p>The code in this project was documented via <a href="https://doxygen.nl/">Doxygen</a>. Doxygen documentation can be accessed by opening the <code>index.html</code> file in the <code>html</code> folder. This can be automatically done by running the following command in the terminal out of the <code>wizard</code> project folder: </p><div class="fragment"><div class="line">open ./html/index.html</div>
+</div><!-- fragment --> </div></div><!-- contents -->
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/html/menudata.js b/html/menudata.js
index 20e4f50b2bc8a54d5a0ded27599217b1cdf28b24..0a2bc3bcea92008427aeb8993707e91a70aa1a5b 100644
--- a/html/menudata.js
+++ b/html/menudata.js
@@ -24,6 +24,7 @@
 */
 var menudata={children:[
 {text:"Main Page",url:"index.html"},
+{text:"Related Pages",url:"pages.html"},
 {text:"Classes",url:"annotated.html",children:[
 {text:"Class List",url:"annotated.html"},
 {text:"Class Index",url:"classes.html"},
diff --git a/html/pages.html b/html/pages.html
index ba99f4b8524e48da78517ffdd030f69372d72e0d..2102383cfdef09e89f9b4e1e82a12a902015fabb 100644
--- a/html/pages.html
+++ b/html/pages.html
@@ -90,61 +90,7 @@ $(function(){ initResizable(false); });
 <div class="contents">
 <div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
 <table class="directory">
-<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2_c_o_n_t_r_i_b_u_t_i_n_g.html" target="_self">How to become a contributor and submit your own code</a></td><td class="desc"></td></tr>
-<tr id="row_1_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2advanced.html" target="_self">Advanced googletest Topics</a></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2community__created__documentation.html" target="_self">Community-Created Documentation</a></td><td class="desc"></td></tr>
-<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2faq.html" target="_self">Googletest FAQ</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2gmock__cheat__sheet.html" target="_self">gMock Cheat Sheet</a></td><td class="desc"></td></tr>
-<tr id="row_5_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2gmock__cook__book.html" target="_self">gMock Cookbook</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2gmock__faq.html" target="_self">Legacy gMock FAQ</a></td><td class="desc"></td></tr>
-<tr id="row_7_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2gmock__for__dummies.html" target="_self">gMock for Dummies</a></td><td class="desc"></td></tr>
-<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2index.html" target="_self">GoogleTest User&#39;s Guide</a></td><td class="desc"></td></tr>
-<tr id="row_9_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2pkgconfig.html" target="_self">Using GoogleTest from various build systems</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2platforms.html" target="_self">Supported Platforms</a></td><td class="desc"></td></tr>
-<tr id="row_11_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2primer.html" target="_self">Googletest Primer</a></td><td class="desc"></td></tr>
-<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2quickstart-bazel.html" target="_self">Quickstart: Building with Bazel</a></td><td class="desc"></td></tr>
-<tr id="row_13_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2quickstart-cmake.html" target="_self">Quickstart: Building with CMake</a></td><td class="desc"></td></tr>
-<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2docs_2samples.html" target="_self">Googletest Samples</a></td><td class="desc"></td></tr>
-<tr id="row_15_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googlemock_2docs_2_r_e_a_d_m_e.html" target="_self">Content Moved</a></td><td class="desc"></td></tr>
-<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googlemock_2include_2gmock_2internal_2custom_2_r_e_a_d_m_e.html" target="_self">Customization Points</a></td><td class="desc"></td></tr>
-<tr id="row_17_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googlemock_2_r_e_a_d_m_e.html" target="_self">Googletest Mocking (gMock) Framework</a></td><td class="desc"></td></tr>
-<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googlemock_2scripts_2_r_e_a_d_m_e.html" target="_self">Please Note:</a></td><td class="desc"></td></tr>
-<tr id="row_19_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googletest_2docs_2_r_e_a_d_m_e.html" target="_self">Content Moved</a></td><td class="desc"></td></tr>
-<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googletest_2include_2gtest_2internal_2custom_2_r_e_a_d_m_e.html" target="_self">Customization Points</a></td><td class="desc"></td></tr>
-<tr id="row_21_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googletest_2_r_e_a_d_m_e.html" target="_self">Generic Build Instructions</a></td><td class="desc"></td></tr>
-<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2googletest_2scripts_2_r_e_a_d_m_e.html" target="_self">Please Note:</a></td><td class="desc"></td></tr>
-<tr id="row_23_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_googletest_2lib_2_r_e_a_d_m_e.html" target="_self">GoogleTest</a></td><td class="desc"></td></tr>
-<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2_c_h_a_n_g_e_l_o_g.html" target="_self">Change Log</a></td><td class="desc"></td></tr>
-<tr id="row_25_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2contrib_2natvis_2_r_e_a_d_m_e.html" target="_self">rapidjson.natvis</a></td><td class="desc"></td></tr>
-<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2dom.html" target="_self">DOM</a></td><td class="desc"></td></tr>
-<tr id="row_27_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2dom_8zh-cn.html" target="_self">DOM</a></td><td class="desc"></td></tr>
-<tr id="row_28_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2encoding.html" target="_self">Encoding</a></td><td class="desc"></td></tr>
-<tr id="row_29_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2encoding_8zh-cn.html" target="_self">编码</a></td><td class="desc"></td></tr>
-<tr id="row_30_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2faq.html" target="_self">FAQ</a></td><td class="desc"></td></tr>
-<tr id="row_31_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2faq_8zh-cn.html" target="_self">常见问题</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2features.html" target="_self">Features</a></td><td class="desc"></td></tr>
-<tr id="row_33_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2features_8zh-cn.html" target="_self">特点</a></td><td class="desc"></td></tr>
-<tr id="row_34_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2internals.html" target="_self">Internals</a></td><td class="desc"></td></tr>
-<tr id="row_35_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2internals_8zh-cn.html" target="_self">内部架构</a></td><td class="desc"></td></tr>
-<tr id="row_36_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2npm.html" target="_self">NPM</a></td><td class="desc"></td></tr>
-<tr id="row_37_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2performance.html" target="_self">Performance</a></td><td class="desc"></td></tr>
-<tr id="row_38_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2performance_8zh-cn.html" target="_self">性能</a></td><td class="desc"></td></tr>
-<tr id="row_39_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2pointer.html" target="_self">Pointer</a></td><td class="desc"></td></tr>
-<tr id="row_40_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2pointer_8zh-cn.html" target="_self">Pointer</a></td><td class="desc"></td></tr>
-<tr id="row_41_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2sax.html" target="_self">SAX</a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2sax_8zh-cn.html" target="_self">SAX</a></td><td class="desc"></td></tr>
-<tr id="row_43_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2schema.html" target="_self">Schema</a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2schema_8zh-cn.html" target="_self">Schema</a></td><td class="desc"></td></tr>
-<tr id="row_45_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2stream.html" target="_self">Stream</a></td><td class="desc"></td></tr>
-<tr id="row_46_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2stream_8zh-cn.html" target="_self">流</a></td><td class="desc"></td></tr>
-<tr id="row_47_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2tutorial.html" target="_self">Tutorial</a></td><td class="desc"></td></tr>
-<tr id="row_48_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2doc_2tutorial_8zh-cn.html" target="_self">教程</a></td><td class="desc"></td></tr>
-<tr id="row_49_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2readme.html" target="_self">readme</a></td><td class="desc"></td></tr>
-<tr id="row_50_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_rapidjson_2readme_8zh-cn.html" target="_self">readme.zh-cn</a></td><td class="desc"></td></tr>
-<tr id="row_51_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md__r_e_a_d_m_e.html" target="_self">Software Engineering Project - Wizard</a></td><td class="desc"></td></tr>
-<tr id="row_52_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_sockpp_2_c_h_a_n_g_e_l_o_g.html" target="_self">Change Log</a></td><td class="desc"></td></tr>
-<tr id="row_53_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_sockpp_2_c_o_n_t_r_i_b_u_t_i_n_g.html" target="_self">Contributing to &lt;em&gt;sockpp&lt;/em&gt;</a></td><td class="desc"></td></tr>
-<tr id="row_54_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md_sockpp_2_r_e_a_d_m_e.html" target="_self">sockpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="md__r_e_a_d_m_e.html" target="_self">Software Engineering Project - Wizard</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/html/search/all_0.js b/html/search/all_0.js
index 1df1341a8fe9c923c810c9c601229e9b144bbcd2..ad207298fb5938b32abfbad2e6da1ff0cc63dcf0 100644
--- a/html/search/all_0.js
+++ b/html/search/all_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['04_0',['04',['../index.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04']]]
+  ['04_0',['04',['../md__r_e_a_d_m_e.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md28',1,'2.1.1 Ubuntu 24.04'],['../md__r_e_a_d_m_e.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04'],['../index.html#autotoc_md31',1,'2.2.1 Ubuntu 24.04']]]
 ];
diff --git a/html/search/all_1.js b/html/search/all_1.js
index dbf5fd77757146571ffffbbd43889df91d5eddec..07906b7f6ef1d5ce9c9bbd0a2b581501def04835 100644
--- a/html/search/all_1.js
+++ b/html/search/all_1.js
@@ -1,9 +1,9 @@
 var searchData=
 [
-  ['1_201_20ubuntu_2024_2004_0',['2.1.1 Ubuntu 24.04',['../index.html#autotoc_md8',1,'']]],
-  ['1_202_20macos_20sequoia_1',['2.1.2 macOS Sequoia',['../index.html#autotoc_md9',1,'']]],
-  ['1_20macos_20sequoia_2',['2.2.1 macOS Sequoia',['../index.html#autotoc_md12',1,'']]],
-  ['1_20overview_3',['1 Overview',['../index.html#autotoc_md4',1,'']]],
-  ['1_20prepare_20os_20environment_4',['2.1 Prepare OS Environment',['../index.html#autotoc_md7',1,'']]],
-  ['1_20ubuntu_2024_2004_5',['1 Ubuntu 24 04',['../index.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04']]]
+  ['1_201_20ubuntu_2024_2004_0',['1 1 Ubuntu 24 04',['../md__r_e_a_d_m_e.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md28',1,'2.1.1 Ubuntu 24.04']]],
+  ['1_202_20macos_20sequoia_1',['1 2 macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md29',1,'2.1.2 macOS Sequoia']]],
+  ['1_20macos_20sequoia_2',['1 macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md12',1,'2.2.1 macOS Sequoia'],['../index.html#autotoc_md32',1,'2.2.1 macOS Sequoia']]],
+  ['1_20overview_3',['1 Overview',['../md__r_e_a_d_m_e.html#autotoc_md4',1,'1 Overview'],['../index.html#autotoc_md24',1,'1 Overview']]],
+  ['1_20prepare_20os_20environment_4',['1 Prepare OS Environment',['../md__r_e_a_d_m_e.html#autotoc_md7',1,'2.1 Prepare OS Environment'],['../index.html#autotoc_md27',1,'2.1 Prepare OS Environment']]],
+  ['1_20ubuntu_2024_2004_5',['1 Ubuntu 24 04',['../md__r_e_a_d_m_e.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md28',1,'2.1.1 Ubuntu 24.04'],['../md__r_e_a_d_m_e.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04'],['../index.html#autotoc_md31',1,'2.2.1 Ubuntu 24.04']]]
 ];
diff --git a/html/search/all_10.js b/html/search/all_10.js
index 43269148016fdd754af9ee7fb0cf01d34fc2c2c0..b1e220a47797530946511cc9695c9ec82ae71bca 100644
--- a/html/search/all_10.js
+++ b/html/search/all_10.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['leave_5fgame_5frequest_0',['leave_game_request',['../classleave__game__request.html',1,'']]],
-  ['leavegame_1',['leaveGame',['../class_game_controller.html#a8d42b2e41759bfd65cdebad87437369e',1,'GameController']]]
+  ['macos_20sequoia_0',['macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md29',1,'2.1.2 macOS Sequoia'],['../md__r_e_a_d_m_e.html#autotoc_md12',1,'2.2.1 macOS Sequoia'],['../index.html#autotoc_md32',1,'2.2.1 macOS Sequoia']]],
+  ['maingamepanelwizard_1',['MainGamePanelWizard',['../class_main_game_panel_wizard.html',1,'MainGamePanelWizard'],['../class_main_game_panel_wizard.html#a6ba532223a22fe5458e3f94a70e2bbf6',1,'MainGamePanelWizard::MainGamePanelWizard()']]]
 ];
diff --git a/html/search/all_11.js b/html/search/all_11.js
index 2890520f6e7e2e8bfc30811a7af3ca64fff5b5e7..5299b786e484188963f1f5046ca49c2cafea90d9 100644
--- a/html/search/all_11.js
+++ b/html/search/all_11.js
@@ -1,5 +1,6 @@
 var searchData=
 [
-  ['macos_20sequoia_0',['macOS Sequoia',['../index.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md12',1,'2.2.1 macOS Sequoia']]],
-  ['maingamepanelwizard_1',['MainGamePanelWizard',['../class_main_game_panel_wizard.html',1,'MainGamePanelWizard'],['../class_main_game_panel_wizard.html#a6ba532223a22fe5458e3f94a70e2bbf6',1,'MainGamePanelWizard::MainGamePanelWizard()']]]
+  ['on_20different_20devices_0',['on different devices',['../md__r_e_a_d_m_e.html#autotoc_md17',1,'Play on different devices'],['../index.html#autotoc_md37',1,'Play on different devices']]],
+  ['os_20environment_1',['OS Environment',['../md__r_e_a_d_m_e.html#autotoc_md7',1,'2.1 Prepare OS Environment'],['../index.html#autotoc_md27',1,'2.1 Prepare OS Environment']]],
+  ['overview_2',['Overview',['../md__r_e_a_d_m_e.html#autotoc_md4',1,'1 Overview'],['../index.html#autotoc_md24',1,'1 Overview']]]
 ];
diff --git a/html/search/all_12.js b/html/search/all_12.js
index 50276fcd1d7e7688a22c8c09ba41630e1094b31b..9b1384da1fcfcedc9ee4300e1d68fbd9cfd332c6 100644
--- a/html/search/all_12.js
+++ b/html/search/all_12.js
@@ -1,5 +1,13 @@
 var searchData=
 [
-  ['os_20environment_0',['2.1 Prepare OS Environment',['../index.html#autotoc_md7',1,'']]],
-  ['overview_1',['1 Overview',['../index.html#autotoc_md4',1,'']]]
+  ['play_20on_20different_20devices_0',['Play on different devices',['../md__r_e_a_d_m_e.html#autotoc_md17',1,'Play on different devices'],['../index.html#autotoc_md37',1,'Play on different devices']]],
+  ['play_20the_20game_1',['Play the Game',['../md__r_e_a_d_m_e.html#autotoc_md16',1,'4 Play the Game'],['../index.html#autotoc_md36',1,'4 Play the Game']]],
+  ['play_5fcard_2',['play_card',['../classgame__state.html#a6c65d95086a88b8d111de5553e1210ec',1,'game_state::play_card()'],['../classgame__instance.html#a1a7e19a4b0907cb0b5f1523edb7e68ca',1,'game_instance::play_card()']]],
+  ['play_5fcard_5frequest_3',['play_card_request',['../classplay__card__request.html',1,'']]],
+  ['playcard_4',['playCard',['../class_game_controller.html#a87b164e2094901861e5b47056634facc',1,'GameController']]],
+  ['player_5',['player',['../classplayer.html',1,'player'],['../classplayer.html#a1f0916939a8caa2e7140d5c89a6aa718',1,'player::player(const std::string &amp;name)'],['../classplayer.html#aa97dd36228b56912bc5dad63f64e1ccf',1,'player::player(const std::string &amp;id, const std::string &amp;name)']]],
+  ['player_5fmanager_6',['player_manager',['../classplayer__manager.html',1,'']]],
+  ['prepare_20os_20environment_7',['Prepare OS Environment',['../md__r_e_a_d_m_e.html#autotoc_md7',1,'2.1 Prepare OS Environment'],['../index.html#autotoc_md27',1,'2.1 Prepare OS Environment']]],
+  ['processestimatetricks_8',['processEstimateTricks',['../class_game_controller.html#a5f1023f2029e5dbb25b795a0606e06a9',1,'GameController']]],
+  ['project_20wizard_9',['Project Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]]
 ];
diff --git a/html/search/all_13.js b/html/search/all_13.js
index 9a4887a9b8b60222df317a519b08ff4508008831..27a14a988128d1e101a92b7fbb2aed9a78609ffd 100644
--- a/html/search/all_13.js
+++ b/html/search/all_13.js
@@ -1,12 +1,9 @@
 var searchData=
 [
-  ['play_20the_20game_0',['4 Play the Game',['../index.html#autotoc_md16',1,'']]],
-  ['play_5fcard_1',['play_card',['../classgame__state.html#a6c65d95086a88b8d111de5553e1210ec',1,'game_state::play_card()'],['../classgame__instance.html#a1a7e19a4b0907cb0b5f1523edb7e68ca',1,'game_instance::play_card()']]],
-  ['play_5fcard_5frequest_2',['play_card_request',['../classplay__card__request.html',1,'']]],
-  ['playcard_3',['playCard',['../class_game_controller.html#a87b164e2094901861e5b47056634facc',1,'GameController']]],
-  ['player_4',['player',['../classplayer.html',1,'player'],['../classplayer.html#a1f0916939a8caa2e7140d5c89a6aa718',1,'player::player(const std::string &amp;name)'],['../classplayer.html#aa97dd36228b56912bc5dad63f64e1ccf',1,'player::player(const std::string &amp;id, const std::string &amp;name)']]],
-  ['player_5fmanager_5',['player_manager',['../classplayer__manager.html',1,'']]],
-  ['prepare_20os_20environment_6',['2.1 Prepare OS Environment',['../index.html#autotoc_md7',1,'']]],
-  ['processestimatetricks_7',['processEstimateTricks',['../class_game_controller.html#a5f1023f2029e5dbb25b795a0606e06a9',1,'GameController']]],
-  ['project_20wizard_8',['Software Engineering Project - Wizard',['../index.html',1,'']]]
+  ['remove_5fcard_0',['remove_card',['../classhand.html#aa466496b7ce0b58dbd63620535430439',1,'hand']]],
+  ['remove_5fplayer_1',['remove_player',['../classgame__state.html#a734fc594d457aa4e6db5bc7467e6442d',1,'game_state']]],
+  ['request_5fhandler_2',['request_handler',['../classrequest__handler.html',1,'']]],
+  ['request_5fresponse_3',['request_response',['../classrequest__response.html',1,'']]],
+  ['responselistenerthread_4',['ResponseListenerThread',['../class_response_listener_thread.html',1,'']]],
+  ['run_20the_20game_5',['Run the Game',['../md__r_e_a_d_m_e.html#autotoc_md14',1,'3 Run the Game'],['../index.html#autotoc_md34',1,'3 Run the Game']]]
 ];
diff --git a/html/search/all_14.js b/html/search/all_14.js
index 145c342a900b477d17558c1d4c32023aff6c7532..7dc8ad5200f4aa761b2844053cf0adec7ca56046 100644
--- a/html/search/all_14.js
+++ b/html/search/all_14.js
@@ -1,9 +1,33 @@
 var searchData=
 [
-  ['remove_5fcard_0',['remove_card',['../classhand.html#aa466496b7ce0b58dbd63620535430439',1,'hand']]],
-  ['remove_5fplayer_1',['remove_player',['../classgame__state.html#a734fc594d457aa4e6db5bc7467e6442d',1,'game_state']]],
-  ['request_5fhandler_2',['request_handler',['../classrequest__handler.html',1,'']]],
-  ['request_5fresponse_3',['request_response',['../classrequest__response.html',1,'']]],
-  ['responselistenerthread_4',['ResponseListenerThread',['../class_response_listener_thread.html',1,'']]],
-  ['run_20the_20game_5',['3 Run the Game',['../index.html#autotoc_md14',1,'']]]
+  ['scoreboarddialog_0',['ScoreBoardDialog',['../class_score_board_dialog.html',1,'']]],
+  ['scoredialog_1',['ScoreDialog',['../class_score_dialog.html',1,'']]],
+  ['sequoia_2',['Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md29',1,'2.1.2 macOS Sequoia'],['../md__r_e_a_d_m_e.html#autotoc_md12',1,'2.2.1 macOS Sequoia'],['../index.html#autotoc_md32',1,'2.2.1 macOS Sequoia']]],
+  ['serializable_3',['serializable',['../classserializable.html',1,'']]],
+  ['serializable_5fvalue_4',['serializable_value',['../classserializable__value.html',1,'']]],
+  ['serializable_5fvalue_3c_20bool_20_3e_5',['serializable_value&lt; bool &gt;',['../classserializable__value.html',1,'']]],
+  ['serializable_5fvalue_3c_20int_20_3e_6',['serializable_value&lt; int &gt;',['../classserializable__value.html',1,'']]],
+  ['serializable_5fvalue_3c_20std_3a_3astring_20_3e_7',['serializable_value&lt; std::string &gt;',['../classserializable__value.html',1,'']]],
+  ['server_8',['server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]],
+  ['server_5fnetwork_5fmanager_9',['server_network_manager',['../classserver__network__manager.html',1,'']]],
+  ['server_5fresponse_10',['server_response',['../classserver__response.html',1,'']]],
+  ['set_5fgame_5fid_11',['set_game_id',['../classplayer.html#aa916eeacf97f00507f412fd91bfe37d4',1,'player']]],
+  ['set_5fhas_5fleft_5fgame_12',['set_has_left_game',['../classplayer.html#a42f88a13ce2b65360f6ee95281a09173',1,'player']]],
+  ['set_5fnof_5fpredicted_13',['set_nof_predicted',['../classplayer.html#a1a3ce0ac69cad799641f4d732435c3f7',1,'player']]],
+  ['set_5fnof_5ftricks_14',['set_nof_tricks',['../classplayer.html#a61aa38ceff0c856b36642c4bc0081433',1,'player']]],
+  ['set_5fplayer_5fname_15',['set_player_name',['../classplayer.html#af8f0b088e697fcb972bfc41302e63877',1,'player']]],
+  ['set_5fscores_16',['set_scores',['../classplayer.html#af1d7e67eee27af87c01e43508a731bd4',1,'player']]],
+  ['set_5ftrick_17',['set_trick',['../classgame__state.html#a745dd23945b6165470c494b036ac4667',1,'game_state']]],
+  ['set_5ftrick_5fcolor_18',['set_trick_color',['../classtrick.html#a0f8c45882691509564ec42efed0d1aaa',1,'trick']]],
+  ['set_5fup_5fround_19',['set_up_round',['../classtrick.html#ae5b769ed0fc2933c1a44b5e481c18b00',1,'trick']]],
+  ['setup_5fround_20',['setup_round',['../classdeck.html#a77851e5cb8297849e91a885ed7959de1',1,'deck::setup_round()'],['../classgame__state.html#ab520d4076c53f70a68bc19f355243a4d',1,'game_state::setup_round()'],['../classplayer.html#a8cc6464ca3284140c92c6983ee62a299',1,'player::setup_round()']]],
+  ['showerror_21',['showError',['../class_game_controller.html#adf043f9026a62f634a873c9f9d292034',1,'GameController']]],
+  ['showgameovermessage_22',['showGameOverMessage',['../class_game_controller.html#abb91c546ab8400c1e2e9f2a2ccc8298f',1,'GameController']]],
+  ['shownewroundmessage_23',['showNewRoundMessage',['../class_game_controller.html#a3c350056b82df662c946cb9119f11ced',1,'GameController']]],
+  ['showstatus_24',['showStatus',['../class_game_controller.html#a6a43eb061a9882b3937fc88bb4794324',1,'GameController']]],
+  ['showtrickovermessage_25',['showTrickOverMessage',['../class_game_controller.html#a8108659ad09724318c3a251d93bd5869',1,'GameController']]],
+  ['software_20engineering_20project_20wizard_26',['Software Engineering Project Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]],
+  ['start_5fgame_27',['start_game',['../classgame__state.html#a6ca6536eaec3404ff9b1ab39b8df4e67',1,'game_state::start_game()'],['../classgame__instance.html#aee2eedd24991ce59dbcf2ec4f6cae8ac',1,'game_instance::start_game()']]],
+  ['start_5fgame_5frequest_28',['start_game_request',['../classstart__game__request.html',1,'']]],
+  ['startgame_29',['startGame',['../class_game_controller.html#a8f30ab3ff471ac0a5c8b88dc7fea45f4',1,'GameController']]]
 ];
diff --git a/html/search/all_15.js b/html/search/all_15.js
index 21285ab56cee6dd6cdad9fcf1f24f23a02995f8a..62cb5608d87314ddfb5a1a9d77cc6ce307cc0284 100644
--- a/html/search/all_15.js
+++ b/html/search/all_15.js
@@ -1,33 +1,10 @@
 var searchData=
 [
-  ['scoreboarddialog_0',['ScoreBoardDialog',['../class_score_board_dialog.html',1,'']]],
-  ['scoredialog_1',['ScoreDialog',['../class_score_dialog.html',1,'']]],
-  ['sequoia_2',['Sequoia',['../index.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md12',1,'2.2.1 macOS Sequoia']]],
-  ['serializable_3',['serializable',['../classserializable.html',1,'']]],
-  ['serializable_5fvalue_4',['serializable_value',['../classserializable__value.html',1,'']]],
-  ['serializable_5fvalue_3c_20bool_20_3e_5',['serializable_value&lt; bool &gt;',['../classserializable__value.html',1,'']]],
-  ['serializable_5fvalue_3c_20int_20_3e_6',['serializable_value&lt; int &gt;',['../classserializable__value.html',1,'']]],
-  ['serializable_5fvalue_3c_20std_3a_3astring_20_3e_7',['serializable_value&lt; std::string &gt;',['../classserializable__value.html',1,'']]],
-  ['server_5fnetwork_5fmanager_8',['server_network_manager',['../classserver__network__manager.html',1,'']]],
-  ['server_5fresponse_9',['server_response',['../classserver__response.html',1,'']]],
-  ['set_5fgame_5fid_10',['set_game_id',['../classplayer.html#aa916eeacf97f00507f412fd91bfe37d4',1,'player']]],
-  ['set_5fhas_5fleft_5fgame_11',['set_has_left_game',['../classplayer.html#a42f88a13ce2b65360f6ee95281a09173',1,'player']]],
-  ['set_5fnof_5fpredicted_12',['set_nof_predicted',['../classplayer.html#a1a3ce0ac69cad799641f4d732435c3f7',1,'player']]],
-  ['set_5fnof_5ftricks_13',['set_nof_tricks',['../classplayer.html#a61aa38ceff0c856b36642c4bc0081433',1,'player']]],
-  ['set_5fplayer_5fname_14',['set_player_name',['../classplayer.html#af8f0b088e697fcb972bfc41302e63877',1,'player']]],
-  ['set_5fscores_15',['set_scores',['../classplayer.html#af1d7e67eee27af87c01e43508a731bd4',1,'player']]],
-  ['set_5ftrick_16',['set_trick',['../classgame__state.html#a745dd23945b6165470c494b036ac4667',1,'game_state']]],
-  ['set_5ftrick_5fcolor_17',['set_trick_color',['../classtrick.html#a0f8c45882691509564ec42efed0d1aaa',1,'trick']]],
-  ['set_5fup_5fround_18',['set_up_round',['../classtrick.html#ae5b769ed0fc2933c1a44b5e481c18b00',1,'trick']]],
-  ['setup_5fround_19',['setup_round',['../classdeck.html#a77851e5cb8297849e91a885ed7959de1',1,'deck::setup_round()'],['../classgame__state.html#ab520d4076c53f70a68bc19f355243a4d',1,'game_state::setup_round()'],['../classplayer.html#a8cc6464ca3284140c92c6983ee62a299',1,'player::setup_round()']]],
-  ['showerror_20',['showError',['../class_game_controller.html#adf043f9026a62f634a873c9f9d292034',1,'GameController']]],
-  ['showgameovermessage_21',['showGameOverMessage',['../class_game_controller.html#abb91c546ab8400c1e2e9f2a2ccc8298f',1,'GameController']]],
-  ['shownewroundmessage_22',['showNewRoundMessage',['../class_game_controller.html#a3c350056b82df662c946cb9119f11ced',1,'GameController']]],
-  ['showstatus_23',['showStatus',['../class_game_controller.html#a6a43eb061a9882b3937fc88bb4794324',1,'GameController']]],
-  ['showtrickovermessage_24',['showTrickOverMessage',['../class_game_controller.html#a8108659ad09724318c3a251d93bd5869',1,'GameController']]],
-  ['software_20engineering_20project_20wizard_25',['Software Engineering Project - Wizard',['../index.html',1,'']]],
-  ['special_20features_26',['5 Special Features',['../index.html#autotoc_md17',1,'']]],
-  ['start_5fgame_27',['start_game',['../classgame__state.html#a6ca6536eaec3404ff9b1ab39b8df4e67',1,'game_state::start_game()'],['../classgame__instance.html#aee2eedd24991ce59dbcf2ec4f6cae8ac',1,'game_instance::start_game()']]],
-  ['start_5fgame_5frequest_28',['start_game_request',['../classstart__game__request.html',1,'']]],
-  ['startgame_29',['startGame',['../class_game_controller.html#a8f30ab3ff471ac0a5c8b88dc7fea45f4',1,'GameController']]]
+  ['the_20game_0',['the Game',['../md__r_e_a_d_m_e.html#autotoc_md14',1,'3 Run the Game'],['../index.html#autotoc_md34',1,'3 Run the Game'],['../md__r_e_a_d_m_e.html#autotoc_md16',1,'4 Play the Game'],['../index.html#autotoc_md36',1,'4 Play the Game']]],
+  ['to_20host_20server_1',['to host server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]],
+  ['trick_2',['trick',['../classtrick.html',1,'trick'],['../classtrick.html#a3b0a12789b87d15d9cdc4e5b6f85b47d',1,'trick::trick()'],['../classtrick.html#ad55ad2f0462144ee39c0e6d392543a14',1,'trick::trick(const trick &amp;other)'],['../classtrick.html#abb172ad9a476e96a754eea0c33e1eda9',1,'trick::trick(const std::string &amp;id)'],['../classtrick.html#ab756ba7a19c4bf98f0d8456ad0081fc3',1,'trick::trick(const std::string &amp;id, const std::vector&lt; std::pair&lt; card *, player * &gt; &gt; &amp;cards, serializable_value&lt; int &gt; *trick_color, serializable_value&lt; int &gt; *trump_color)'],['../classtrick.html#a3ecb1c5ebe84a300d7388e2846737fa4',1,'trick::trick(int trump)']]],
+  ['trickestimationpanel_3',['TrickEstimationPanel',['../class_trick_estimation_panel.html',1,'']]],
+  ['try_5fadd_5fplayer_4',['try_add_player',['../classgame__instance.html#a1176ce8464586487f9ae5676ca900e10',1,'game_instance']]],
+  ['try_5fget_5fcard_5',['try_get_card',['../classhand.html#a0a50cbbb167e6a1d633dd48bc4b695fe',1,'hand']]],
+  ['try_5fremove_5fplayer_6',['try_remove_player',['../classgame__instance.html#a2c6fed45a14273b09a9f202481fa62aa',1,'game_instance']]]
 ];
diff --git a/html/search/all_16.js b/html/search/all_16.js
index c2c50b5b364adfd90b4d39139537e974f863e20e..5e98679e8be5bcdb0f20d5684fb7ea799e3787fa 100644
--- a/html/search/all_16.js
+++ b/html/search/all_16.js
@@ -1,9 +1,8 @@
 var searchData=
 [
-  ['the_20game_0',['the Game',['../index.html#autotoc_md14',1,'3 Run the Game'],['../index.html#autotoc_md16',1,'4 Play the Game']]],
-  ['trick_1',['trick',['../classtrick.html',1,'trick'],['../classtrick.html#a3b0a12789b87d15d9cdc4e5b6f85b47d',1,'trick::trick()'],['../classtrick.html#ad55ad2f0462144ee39c0e6d392543a14',1,'trick::trick(const trick &amp;other)'],['../classtrick.html#abb172ad9a476e96a754eea0c33e1eda9',1,'trick::trick(const std::string &amp;id)'],['../classtrick.html#ab756ba7a19c4bf98f0d8456ad0081fc3',1,'trick::trick(const std::string &amp;id, const std::vector&lt; std::pair&lt; card *, player * &gt; &gt; &amp;cards, serializable_value&lt; int &gt; *trick_color, serializable_value&lt; int &gt; *trump_color)'],['../classtrick.html#a3ecb1c5ebe84a300d7388e2846737fa4',1,'trick::trick(int trump)']]],
-  ['trickestimationpanel_2',['TrickEstimationPanel',['../class_trick_estimation_panel.html',1,'']]],
-  ['try_5fadd_5fplayer_3',['try_add_player',['../classgame__instance.html#a1176ce8464586487f9ae5676ca900e10',1,'game_instance']]],
-  ['try_5fget_5fcard_4',['try_get_card',['../classhand.html#a0a50cbbb167e6a1d633dd48bc4b695fe',1,'hand']]],
-  ['try_5fremove_5fplayer_5',['try_remove_player',['../classgame__instance.html#a2c6fed45a14273b09a9f202481fa62aa',1,'game_instance']]]
+  ['ubuntu_2024_2004_0',['Ubuntu 24 04',['../md__r_e_a_d_m_e.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md28',1,'2.1.1 Ubuntu 24.04'],['../md__r_e_a_d_m_e.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04'],['../index.html#autotoc_md31',1,'2.2.1 Ubuntu 24.04']]],
+  ['unique_5fserializable_1',['unique_serializable',['../classunique__serializable.html',1,'']]],
+  ['update_5fcurrent_5fplayer_2',['update_current_player',['../classgame__state.html#a49851709fcec061d36478ed2fdcc3d9d',1,'game_state']]],
+  ['updategamestate_3',['updateGameState',['../class_game_controller.html#a994773f79be8c9e8dc8c19ee2d389103',1,'GameController']]],
+  ['uuid_5fgenerator_4',['uuid_generator',['../classuuid__generator.html',1,'']]]
 ];
diff --git a/html/search/all_17.js b/html/search/all_17.js
index b9ad200bc204e1f6e4e0917246a0aa7ce018a4c4..dc14b07e6159ab284a8d15173e1c0cea543334ed 100644
--- a/html/search/all_17.js
+++ b/html/search/all_17.js
@@ -1,8 +1,8 @@
 var searchData=
 [
-  ['ubuntu_2024_2004_0',['Ubuntu 24 04',['../index.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04']]],
-  ['unique_5fserializable_1',['unique_serializable',['../classunique__serializable.html',1,'']]],
-  ['update_5fcurrent_5fplayer_2',['update_current_player',['../classgame__state.html#a49851709fcec061d36478ed2fdcc3d9d',1,'game_state']]],
-  ['updategamestate_3',['updateGameState',['../class_game_controller.html#a994773f79be8c9e8dc8c19ee2d389103',1,'GameController']]],
-  ['uuid_5fgenerator_4',['uuid_generator',['../classuuid__generator.html',1,'']]]
+  ['wizard_0',['Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard'],['../class_wizard.html',1,'Wizard']]],
+  ['wizardexception_1',['WizardException',['../class_wizard_exception.html',1,'']]],
+  ['wrap_5fup_5fround_2',['wrap_up_round',['../classgame__state.html#ad2e967638043670ebae93dd6ec32e91e',1,'game_state::wrap_up_round()'],['../classplayer.html#a193bcc63da13e5bc98eb46ed99381302',1,'player::wrap_up_round()']]],
+  ['wrap_5fup_5ftrick_3',['wrap_up_trick',['../classtrick.html#a384560623ffaf776797948cf35197c73',1,'trick']]],
+  ['write_5finto_5fjson_4',['write_into_json',['../classcard.html#a7f900b843e44fb18364f32dbe6cdbc7a',1,'card::write_into_json()'],['../classdeck.html#a8d226fe699a36bf462010ba1f744fbeb',1,'deck::write_into_json()'],['../classtrick.html#a97176df194eae794691356cd83292b04',1,'trick::write_into_json()'],['../classgame__state.html#a54873cd18b46555915d150a6d8dd6f83',1,'game_state::write_into_json()'],['../classhand.html#a505a82447d0ae305dadcc9c4aa54071e',1,'hand::write_into_json()'],['../classplayer.html#a0cf13abfdb6b837faa88eda064bf51dc',1,'player::write_into_json()']]]
 ];
diff --git a/html/search/all_18.js b/html/search/all_18.js
index 5cf32d69785190d2f5f5dba53be9a9b3ac1e5cf4..688609a17ecd2657de1d22465b69f6fc6b58314f 100644
--- a/html/search/all_18.js
+++ b/html/search/all_18.js
@@ -1,8 +1,10 @@
 var searchData=
 [
-  ['wizard_0',['Wizard',['../index.html',1,'Software Engineering Project - Wizard'],['../class_wizard.html',1,'Wizard']]],
-  ['wizardexception_1',['WizardException',['../class_wizard_exception.html',1,'']]],
-  ['wrap_5fup_5fround_2',['wrap_up_round',['../classgame__state.html#ad2e967638043670ebae93dd6ec32e91e',1,'game_state::wrap_up_round()'],['../classplayer.html#a193bcc63da13e5bc98eb46ed99381302',1,'player::wrap_up_round()']]],
-  ['wrap_5fup_5ftrick_3',['wrap_up_trick',['../classtrick.html#a384560623ffaf776797948cf35197c73',1,'trick']]],
-  ['write_5finto_5fjson_4',['write_into_json',['../classcard.html#a7f900b843e44fb18364f32dbe6cdbc7a',1,'card::write_into_json()'],['../classdeck.html#a8d226fe699a36bf462010ba1f744fbeb',1,'deck::write_into_json()'],['../classtrick.html#a97176df194eae794691356cd83292b04',1,'trick::write_into_json()'],['../classgame__state.html#a54873cd18b46555915d150a6d8dd6f83',1,'game_state::write_into_json()'],['../classhand.html#a505a82447d0ae305dadcc9c4aa54071e',1,'hand::write_into_json()'],['../classplayer.html#a0cf13abfdb6b837faa88eda064bf51dc',1,'player::write_into_json()']]]
+  ['_7ecard_0',['~card',['../classcard.html#ac7a5d8d53e8cc33f5c5a03d8ccb806c4',1,'card']]],
+  ['_7edeck_1',['~deck',['../classdeck.html#a63a688bda08bfef8d2c37d53523b7b12',1,'deck']]],
+  ['_7egame_5finstance_2',['~game_instance',['../classgame__instance.html#a1fa390603341beb15e09e5a4b03465c1',1,'game_instance']]],
+  ['_7egame_5fstate_3',['~game_state',['../classgame__state.html#a2fbc370f93617298719f61514afdb5bc',1,'game_state']]],
+  ['_7ehand_4',['~hand',['../classhand.html#af3ffc5e5b46f04b14f12a9fc130b220a',1,'hand']]],
+  ['_7eplayer_5',['~player',['../classplayer.html#a0a62c0208584465db2daa1ac6e15b1ad',1,'player']]],
+  ['_7etrick_6',['~trick',['../classtrick.html#a22c0b586f1d6c3baeb7bb0e22eb7dfe2',1,'trick']]]
 ];
diff --git a/html/search/all_19.js b/html/search/all_19.js
index 688609a17ecd2657de1d22465b69f6fc6b58314f..799f29fe623b738b5110293dade46a80dc9161d4 100644
--- a/html/search/all_19.js
+++ b/html/search/all_19.js
@@ -1,10 +1,4 @@
 var searchData=
 [
-  ['_7ecard_0',['~card',['../classcard.html#ac7a5d8d53e8cc33f5c5a03d8ccb806c4',1,'card']]],
-  ['_7edeck_1',['~deck',['../classdeck.html#a63a688bda08bfef8d2c37d53523b7b12',1,'deck']]],
-  ['_7egame_5finstance_2',['~game_instance',['../classgame__instance.html#a1fa390603341beb15e09e5a4b03465c1',1,'game_instance']]],
-  ['_7egame_5fstate_3',['~game_state',['../classgame__state.html#a2fbc370f93617298719f61514afdb5bc',1,'game_state']]],
-  ['_7ehand_4',['~hand',['../classhand.html#af3ffc5e5b46f04b14f12a9fc130b220a',1,'hand']]],
-  ['_7eplayer_5',['~player',['../classplayer.html#a0a62c0208584465db2daa1ac6e15b1ad',1,'player']]],
-  ['_7etrick_6',['~trick',['../classtrick.html#a22c0b586f1d6c3baeb7bb0e22eb7dfe2',1,'trick']]]
+  ['🚀_20features_0',['🚀 Features',['../md__r_e_a_d_m_e.html#autotoc_md1',1,'🚀 Features'],['../index.html#autotoc_md21',1,'🚀 Features']]]
 ];
diff --git a/html/search/all_1a.js b/html/search/all_1a.js
index a353cc4811342410220c15c7fba89ffba6a0fc81..53493c8624b7c0935d3b61035b746387beed7688 100644
--- a/html/search/all_1a.js
+++ b/html/search/all_1a.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['🚀_20features_0',['🚀 Features',['../index.html#autotoc_md1',1,'']]]
+  ['🚀_20features_0',['🚀 Features',['../md__r_e_a_d_m_e.html#autotoc_md1',1,'🚀 Features'],['../index.html#autotoc_md19',1,'🚀 Features']]]
 ];
diff --git a/html/search/all_2.js b/html/search/all_2.js
index d1dd2b8fd62677c0827ede8cc3e1ff7dbae3b448..e1f7dc1d2b0dbcd396827b7aeb3784d44c743865 100644
--- a/html/search/all_2.js
+++ b/html/search/all_2.js
@@ -1,15 +1,15 @@
 var searchData=
 [
-  ['2_201_201_20ubuntu_2024_2004_0',['2.1.1 Ubuntu 24.04',['../index.html#autotoc_md8',1,'']]],
-  ['2_201_202_20macos_20sequoia_1',['2.1.2 macOS Sequoia',['../index.html#autotoc_md9',1,'']]],
-  ['2_201_20macos_20sequoia_2',['2.2.1 macOS Sequoia',['../index.html#autotoc_md12',1,'']]],
-  ['2_201_20prepare_20os_20environment_3',['2.1 Prepare OS Environment',['../index.html#autotoc_md7',1,'']]],
-  ['2_201_20ubuntu_2024_2004_4',['2.2.1 Ubuntu 24.04',['../index.html#autotoc_md11',1,'']]],
-  ['2_202_201_20macos_20sequoia_5',['2.2.1 macOS Sequoia',['../index.html#autotoc_md12',1,'']]],
-  ['2_202_201_20ubuntu_2024_2004_6',['2.2.1 Ubuntu 24.04',['../index.html#autotoc_md11',1,'']]],
-  ['2_202_20compile_20code_7',['2.2 Compile Code',['../index.html#autotoc_md10',1,'']]],
-  ['2_20compile_20code_8',['2.2 Compile Code',['../index.html#autotoc_md10',1,'']]],
-  ['2_20compile_20instructions_9',['2 Compile Instructions',['../index.html#autotoc_md6',1,'']]],
-  ['2_20macos_20sequoia_10',['2.1.2 macOS Sequoia',['../index.html#autotoc_md9',1,'']]],
-  ['24_2004_11',['24 04',['../index.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04']]]
+  ['2_201_201_20ubuntu_2024_2004_0',['2 1 1 Ubuntu 24 04',['../md__r_e_a_d_m_e.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md28',1,'2.1.1 Ubuntu 24.04']]],
+  ['2_201_202_20macos_20sequoia_1',['2 1 2 macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md29',1,'2.1.2 macOS Sequoia']]],
+  ['2_201_20macos_20sequoia_2',['2 1 macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md12',1,'2.2.1 macOS Sequoia'],['../index.html#autotoc_md32',1,'2.2.1 macOS Sequoia']]],
+  ['2_201_20prepare_20os_20environment_3',['2 1 Prepare OS Environment',['../md__r_e_a_d_m_e.html#autotoc_md7',1,'2.1 Prepare OS Environment'],['../index.html#autotoc_md27',1,'2.1 Prepare OS Environment']]],
+  ['2_201_20ubuntu_2024_2004_4',['2 1 Ubuntu 24 04',['../md__r_e_a_d_m_e.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04'],['../index.html#autotoc_md31',1,'2.2.1 Ubuntu 24.04']]],
+  ['2_202_201_20macos_20sequoia_5',['2 2 1 macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md12',1,'2.2.1 macOS Sequoia'],['../index.html#autotoc_md32',1,'2.2.1 macOS Sequoia']]],
+  ['2_202_201_20ubuntu_2024_2004_6',['2 2 1 Ubuntu 24 04',['../md__r_e_a_d_m_e.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04'],['../index.html#autotoc_md31',1,'2.2.1 Ubuntu 24.04']]],
+  ['2_202_20compile_20code_7',['2 2 Compile Code',['../md__r_e_a_d_m_e.html#autotoc_md10',1,'2.2 Compile Code'],['../index.html#autotoc_md30',1,'2.2 Compile Code']]],
+  ['2_20compile_20code_8',['2 Compile Code',['../md__r_e_a_d_m_e.html#autotoc_md10',1,'2.2 Compile Code'],['../index.html#autotoc_md30',1,'2.2 Compile Code']]],
+  ['2_20compile_20instructions_9',['2 Compile Instructions',['../md__r_e_a_d_m_e.html#autotoc_md6',1,'2 Compile Instructions'],['../index.html#autotoc_md26',1,'2 Compile Instructions']]],
+  ['2_20macos_20sequoia_10',['2 macOS Sequoia',['../md__r_e_a_d_m_e.html#autotoc_md9',1,'2.1.2 macOS Sequoia'],['../index.html#autotoc_md29',1,'2.1.2 macOS Sequoia']]],
+  ['24_2004_11',['24 04',['../md__r_e_a_d_m_e.html#autotoc_md8',1,'2.1.1 Ubuntu 24.04'],['../index.html#autotoc_md28',1,'2.1.1 Ubuntu 24.04'],['../md__r_e_a_d_m_e.html#autotoc_md11',1,'2.2.1 Ubuntu 24.04'],['../index.html#autotoc_md31',1,'2.2.1 Ubuntu 24.04']]]
 ];
diff --git a/html/search/all_3.js b/html/search/all_3.js
index f5c03b7eaa8dee48c82d9c64bd9f2d00efd9f819..5b7b43d6a6b4099f39cb028a56dedb667ae1e364 100644
--- a/html/search/all_3.js
+++ b/html/search/all_3.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['3_20run_20the_20game_0',['3 Run the Game',['../index.html#autotoc_md14',1,'']]]
+  ['3_20run_20the_20game_0',['3 Run the Game',['../md__r_e_a_d_m_e.html#autotoc_md14',1,'3 Run the Game'],['../index.html#autotoc_md34',1,'3 Run the Game']]]
 ];
diff --git a/html/search/all_4.js b/html/search/all_4.js
index dcda705c5ffda2b3af71ace5ce5eddd452c655ae..aeed346e5ecde22980278bb14f6d773cab25f3ce 100644
--- a/html/search/all_4.js
+++ b/html/search/all_4.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['4_20play_20the_20game_0',['4 Play the Game',['../index.html#autotoc_md16',1,'']]]
+  ['4_20play_20the_20game_0',['4 Play the Game',['../md__r_e_a_d_m_e.html#autotoc_md16',1,'4 Play the Game'],['../index.html#autotoc_md36',1,'4 Play the Game']]]
 ];
diff --git a/html/search/all_5.js b/html/search/all_5.js
index 7513578c86e6acc8db78243c68684130bc4672e4..5fb138f55168943a432f3de65da6a874c22ed408 100644
--- a/html/search/all_5.js
+++ b/html/search/all_5.js
@@ -1,4 +1,6 @@
 var searchData=
 [
-  ['5_20special_20features_0',['5 Special Features',['../index.html#autotoc_md17',1,'']]]
+  ['add_5fcard_0',['add_card',['../classtrick.html#a2d3b5aa88a1469dc3d58f30885752f5d',1,'trick::add_card()'],['../classhand.html#ad4749893f36ff1d6dcda3bb18eaedffb',1,'hand::add_card()'],['../classplayer.html#ab3b087d03dd2c81d893b2ffad459a26f',1,'player::add_card()']]],
+  ['add_5fplayer_1',['add_player',['../classgame__state.html#a4a4fde0700a05c589a6b9c4dbcffac18',1,'game_state']]],
+  ['address_20to_20host_20server_2',['address to host server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]]
 ];
diff --git a/html/search/all_6.js b/html/search/all_6.js
index 0108da970737973010bc88365ec62b9c30d9995e..6a30117788769dddd612dc34f63c69cd22a0c568 100644
--- a/html/search/all_6.js
+++ b/html/search/all_6.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['add_5fcard_0',['add_card',['../classtrick.html#a2d3b5aa88a1469dc3d58f30885752f5d',1,'trick::add_card()'],['../classhand.html#ad4749893f36ff1d6dcda3bb18eaedffb',1,'hand::add_card()'],['../classplayer.html#ab3b087d03dd2c81d893b2ffad459a26f',1,'player::add_card()']]],
-  ['add_5fplayer_1',['add_player',['../classgame__state.html#a4a4fde0700a05c589a6b9c4dbcffac18',1,'game_state']]]
+  ['base_5fclass_5fproperties_0',['base_class_properties',['../structclient__request_1_1base__class__properties.html',1,'client_request::base_class_properties'],['../structserver__response_1_1base__class__properties.html',1,'server_response::base_class_properties']]],
+  ['buildgamestate_1',['buildGameState',['../class_main_game_panel_wizard.html#a83517cab2cccba78cce79450de3bb7f3',1,'MainGamePanelWizard']]]
 ];
diff --git a/html/search/all_7.js b/html/search/all_7.js
index 6a30117788769dddd612dc34f63c69cd22a0c568..34fc3a92c94603b476c8c82a5cc8acf85e004377 100644
--- a/html/search/all_7.js
+++ b/html/search/all_7.js
@@ -1,5 +1,12 @@
 var searchData=
 [
-  ['base_5fclass_5fproperties_0',['base_class_properties',['../structclient__request_1_1base__class__properties.html',1,'client_request::base_class_properties'],['../structserver__response_1_1base__class__properties.html',1,'server_response::base_class_properties']]],
-  ['buildgamestate_1',['buildGameState',['../class_main_game_panel_wizard.html#a83517cab2cccba78cce79450de3bb7f3',1,'MainGamePanelWizard']]]
+  ['card_0',['card',['../classcard.html',1,'card'],['../classcard.html#a764d65641c619aedf1842a30e54905b7',1,'card::card()']]],
+  ['client_5frequest_1',['client_request',['../classclient__request.html',1,'']]],
+  ['clientnetworkmanager_2',['ClientNetworkManager',['../class_client_network_manager.html',1,'']]],
+  ['code_3',['Code',['../md__r_e_a_d_m_e.html#autotoc_md10',1,'2.2 Compile Code'],['../index.html#autotoc_md30',1,'2.2 Compile Code']]],
+  ['coding_20documentation_4',['Coding Documentation',['../md__r_e_a_d_m_e.html#autotoc_md19',1,'Find Coding Documentation'],['../index.html#autotoc_md39',1,'Find Coding Documentation']]],
+  ['compile_20code_5',['Compile Code',['../md__r_e_a_d_m_e.html#autotoc_md10',1,'2.2 Compile Code'],['../index.html#autotoc_md30',1,'2.2 Compile Code']]],
+  ['compile_20instructions_6',['Compile Instructions',['../md__r_e_a_d_m_e.html#autotoc_md6',1,'2 Compile Instructions'],['../index.html#autotoc_md26',1,'2 Compile Instructions']]],
+  ['connectionpanel_7',['ConnectionPanel',['../class_connection_panel.html',1,'']]],
+  ['connecttoserver_8',['connectToServer',['../class_game_controller.html#a023da21da545374ee46fb873149976c4',1,'GameController']]]
 ];
diff --git a/html/search/all_8.js b/html/search/all_8.js
index 11b3cdbcdaa54a9ce5bb94ff2054868d1e875ccd..037270129f8d23f8d53671a299ebb5f401258e81 100644
--- a/html/search/all_8.js
+++ b/html/search/all_8.js
@@ -1,12 +1,11 @@
 var searchData=
 [
-  ['card_0',['card',['../classcard.html',1,'card'],['../classcard.html#a764d65641c619aedf1842a30e54905b7',1,'card::card()']]],
-  ['client_5frequest_1',['client_request',['../classclient__request.html',1,'']]],
-  ['clientnetworkmanager_2',['ClientNetworkManager',['../class_client_network_manager.html',1,'']]],
-  ['closegamewindow_3',['closeGameWindow',['../class_game_controller.html#a21eea505305d56439efb835e1e148c2f',1,'GameController']]],
-  ['code_4',['2.2 Compile Code',['../index.html#autotoc_md10',1,'']]],
-  ['compile_20code_5',['2.2 Compile Code',['../index.html#autotoc_md10',1,'']]],
-  ['compile_20instructions_6',['2 Compile Instructions',['../index.html#autotoc_md6',1,'']]],
-  ['connectionpanel_7',['ConnectionPanel',['../class_connection_panel.html',1,'']]],
-  ['connecttoserver_8',['connectToServer',['../class_game_controller.html#a023da21da545374ee46fb873149976c4',1,'GameController']]]
+  ['decide_5ftrump_5fcolor_5frequest_0',['decide_trump_color_request',['../classdecide__trump__color__request.html',1,'']]],
+  ['deck_1',['deck',['../classdeck.html',1,'deck'],['../classdeck.html#a2ff8465ba7b13201bdf650fe461b442e',1,'deck::deck()'],['../classdeck.html#ac18be42e5ad9ade42faed5be057f558b',1,'deck::deck(const std::vector&lt; card * &gt; &amp;cards)']]],
+  ['derived_5ffrom_2',['derived_from',['../structvector__utils_1_1derived__from.html',1,'vector_utils']]],
+  ['devices_3',['devices',['../md__r_e_a_d_m_e.html#autotoc_md17',1,'Play on different devices'],['../index.html#autotoc_md37',1,'Play on different devices']]],
+  ['different_20devices_4',['different devices',['../md__r_e_a_d_m_e.html#autotoc_md17',1,'Play on different devices'],['../index.html#autotoc_md37',1,'Play on different devices']]],
+  ['documentation_5',['Documentation',['../md__r_e_a_d_m_e.html#autotoc_md19',1,'Find Coding Documentation'],['../index.html#autotoc_md39',1,'Find Coding Documentation']]],
+  ['draw_5fcards_6',['draw_cards',['../classdeck.html#afa56e0fb7919ca1ceebae9b3bd79280d',1,'deck']]],
+  ['draw_5ftrump_7',['draw_trump',['../classdeck.html#ac5b85f992cf36d00873d2c7be7dc8c2b',1,'deck']]]
 ];
diff --git a/html/search/all_9.js b/html/search/all_9.js
index baf482113d1a3693d05c0f5b8dd4da7765e8784d..e7c18fc8c4be6968bb1a27bfa86f4475d595b45e 100644
--- a/html/search/all_9.js
+++ b/html/search/all_9.js
@@ -1,8 +1,9 @@
 var searchData=
 [
-  ['decide_5ftrump_5fcolor_5frequest_0',['decide_trump_color_request',['../classdecide__trump__color__request.html',1,'']]],
-  ['deck_1',['deck',['../classdeck.html',1,'deck'],['../classdeck.html#a2ff8465ba7b13201bdf650fe461b442e',1,'deck::deck()'],['../classdeck.html#ac18be42e5ad9ade42faed5be057f558b',1,'deck::deck(const std::vector&lt; card * &gt; &amp;cards)']]],
-  ['derived_5ffrom_2',['derived_from',['../structvector__utils_1_1derived__from.html',1,'vector_utils']]],
-  ['draw_5fcards_3',['draw_cards',['../classdeck.html#afa56e0fb7919ca1ceebae9b3bd79280d',1,'deck']]],
-  ['draw_5ftrump_4',['draw_trump',['../classdeck.html#ac5b85f992cf36d00873d2c7be7dc8c2b',1,'deck']]]
+  ['engineering_20project_20wizard_0',['Engineering Project Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]],
+  ['environment_1',['Environment',['../md__r_e_a_d_m_e.html#autotoc_md7',1,'2.1 Prepare OS Environment'],['../index.html#autotoc_md27',1,'2.1 Prepare OS Environment']]],
+  ['errordialog_2',['ErrorDialog',['../class_error_dialog.html',1,'']]],
+  ['estimate_5ftricks_3',['estimate_tricks',['../classgame__state.html#ac4ebff625d83c633c124890537d60354',1,'game_state::estimate_tricks()'],['../classgame__instance.html#af1434756e3041deca68b4f4f84176f05',1,'game_instance::estimate_tricks()']]],
+  ['estimate_5ftricks_5frequest_4',['estimate_tricks_request',['../classestimate__tricks__request.html',1,'']]],
+  ['estimatetricks_5',['estimateTricks',['../class_game_controller.html#abd110563d0f37f06096176c199d22055',1,'GameController']]]
 ];
diff --git a/html/search/all_a.js b/html/search/all_a.js
index b5f7df8235729f075ea61fabf590386ab4483cb3..cf433780d9ef5f92820c0d6956fedc67576eec32 100644
--- a/html/search/all_a.js
+++ b/html/search/all_a.js
@@ -1,9 +1,8 @@
 var searchData=
 [
-  ['engineering_20project_20wizard_0',['Software Engineering Project - Wizard',['../index.html',1,'']]],
-  ['environment_1',['2.1 Prepare OS Environment',['../index.html#autotoc_md7',1,'']]],
-  ['errordialog_2',['ErrorDialog',['../class_error_dialog.html',1,'']]],
-  ['estimate_5ftricks_3',['estimate_tricks',['../classgame__state.html#ac4ebff625d83c633c124890537d60354',1,'game_state::estimate_tricks()'],['../classgame__instance.html#af1434756e3041deca68b4f4f84176f05',1,'game_instance::estimate_tricks()']]],
-  ['estimate_5ftricks_5frequest_4',['estimate_tricks_request',['../classestimate__tricks__request.html',1,'']]],
-  ['estimatetricks_5',['estimateTricks',['../class_game_controller.html#abd110563d0f37f06096176c199d22055',1,'GameController']]]
+  ['features_0',['Features',['../md__r_e_a_d_m_e.html#autotoc_md1',1,'🚀 Features'],['../index.html#autotoc_md21',1,'🚀 Features']]],
+  ['find_20coding_20documentation_1',['Find Coding Documentation',['../md__r_e_a_d_m_e.html#autotoc_md19',1,'Find Coding Documentation'],['../index.html#autotoc_md39',1,'Find Coding Documentation']]],
+  ['finish_5fgame_2',['finish_game',['../classgame__state.html#a67fdd4b5682715cd2d848031a9911b17',1,'game_state']]],
+  ['from_5fjson_3',['from_json',['../classcard.html#a48593187c9bff442d61f197991954011',1,'card::from_json()'],['../classdeck.html#abe8dbe828189696c22f35ac3ed4fd296',1,'deck::from_json()'],['../classtrick.html#a1a3d94f638672d3d60d596190ae59dfb',1,'trick::from_json()'],['../classgame__state.html#a794d484961c92b5b737586ec5599963f',1,'game_state::from_json()'],['../classhand.html#aa9cffdf932d80c7304a335074403e785',1,'hand::from_json()'],['../classplayer.html#a5955c5f26db6a08862ccfb443fbe99c5',1,'player::from_json()']]],
+  ['full_5fstate_5fresponse_4',['full_state_response',['../classfull__state__response.html',1,'']]]
 ];
diff --git a/html/search/all_b.js b/html/search/all_b.js
index 0b980789d3508009e043effc68a486ea0a3b10f2..3baad76eefac01e57d345b1a3aa89d9c4189260d 100644
--- a/html/search/all_b.js
+++ b/html/search/all_b.js
@@ -1,7 +1,39 @@
 var searchData=
 [
-  ['features_0',['Features',['../index.html#autotoc_md1',1,'🚀 Features'],['../index.html#autotoc_md17',1,'5 Special Features']]],
-  ['finish_5fgame_1',['finish_game',['../classgame__state.html#a67fdd4b5682715cd2d848031a9911b17',1,'game_state']]],
-  ['from_5fjson_2',['from_json',['../classcard.html#a48593187c9bff442d61f197991954011',1,'card::from_json()'],['../classdeck.html#abe8dbe828189696c22f35ac3ed4fd296',1,'deck::from_json()'],['../classtrick.html#a1a3d94f638672d3d60d596190ae59dfb',1,'trick::from_json()'],['../classgame__state.html#a794d484961c92b5b737586ec5599963f',1,'game_state::from_json()'],['../classhand.html#aa9cffdf932d80c7304a335074403e785',1,'hand::from_json()'],['../classplayer.html#a5955c5f26db6a08862ccfb443fbe99c5',1,'player::from_json()']]],
-  ['full_5fstate_5fresponse_3',['full_state_response',['../classfull__state__response.html',1,'']]]
+  ['game_0',['Game',['../md__r_e_a_d_m_e.html#autotoc_md14',1,'3 Run the Game'],['../index.html#autotoc_md34',1,'3 Run the Game'],['../md__r_e_a_d_m_e.html#autotoc_md16',1,'4 Play the Game'],['../index.html#autotoc_md36',1,'4 Play the Game']]],
+  ['game_5finstance_1',['game_instance',['../classgame__instance.html',1,'game_instance'],['../classgame__instance.html#a2b1d00adf8c933a98698f972827e48b9',1,'game_instance::game_instance()']]],
+  ['game_5finstance_5fmanager_2',['game_instance_manager',['../classgame__instance__manager.html',1,'']]],
+  ['game_5fstate_3',['game_state',['../classgame__state.html',1,'game_state'],['../classgame__state.html#a0c10b830e222d726557c3c33685c595a',1,'game_state::game_state()']]],
+  ['gamecontroller_4',['GameController',['../class_game_controller.html',1,'']]],
+  ['gamewindow_5',['GameWindow',['../class_game_window.html',1,'']]],
+  ['get_20local_20ip_20address_20to_20host_20server_6',['Get local IP address to host server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]],
+  ['get_5fcards_7',['get_cards',['../classhand.html#ad104b0376b1a13d987f349dd524ca47f',1,'hand']]],
+  ['get_5fcards_5fand_5fplayers_8',['get_cards_and_players',['../classtrick.html#a1d75f9e8fc94fd122adfc39a20089268',1,'trick']]],
+  ['get_5fcolor_9',['get_color',['../classcard.html#ab033bc0e71b09d3cf3ac28c2f1fbde18',1,'card']]],
+  ['get_5fcurrent_5fplayer_10',['get_current_player',['../classgame__state.html#a2d16f420a8aa651685461a5efb8bb600',1,'game_state']]],
+  ['get_5fgame_5fid_11',['get_game_id',['../classplayer.html#afeb6c5483a59042fcc4a3a2aed6a6a2c',1,'player']]],
+  ['get_5fgame_5fstate_12',['get_game_state',['../classgame__instance.html#a852c73a12031d7fbd2095530df595c5c',1,'game_instance']]],
+  ['get_5fhand_13',['get_hand',['../classplayer.html#af333dcbf7123726c9bda3ab94ba9ee6d',1,'player']]],
+  ['get_5fid_14',['get_id',['../classgame__instance.html#a72cd93738171ffc856c3d77df5f967da',1,'game_instance']]],
+  ['get_5flast_5ftrick_15',['get_last_trick',['../classgame__state.html#a4327f753f1f5341f9fe3774ea3fbc99b',1,'game_state']]],
+  ['get_5fmax_5fround_5fnumber_16',['get_max_round_number',['../classgame__state.html#aa75c4da6c0056e48e5040be8127d7473',1,'game_state']]],
+  ['get_5fnof_5fcards_17',['get_nof_cards',['../classhand.html#adc90d109b7b564a0dbca0b0798c99641',1,'hand::get_nof_cards()'],['../classplayer.html#a457c5ab90b0ecd610eead66b41c8333a',1,'player::get_nof_cards() const noexcept']]],
+  ['get_5fnof_5fpredicted_18',['get_nof_predicted',['../classplayer.html#a40333c302ff51707749c544930fb80aa',1,'player']]],
+  ['get_5fnof_5ftricks_19',['get_nof_tricks',['../classplayer.html#a5e3d1374aee685b08a29d0ac7cec3df4',1,'player']]],
+  ['get_5fnumber_5fof_5fremaining_5fcards_20',['get_number_of_remaining_cards',['../classdeck.html#ae1c7a4174108a14cb1180de1afdcb6d6',1,'deck']]],
+  ['get_5fplayer_5fname_21',['get_player_name',['../classplayer.html#a42d01dcf4cdbd452fc5dcaf5e6f21773',1,'player']]],
+  ['get_5fplayers_22',['get_players',['../classgame__state.html#abcaccd551f938f961d12266e34c037d2',1,'game_state']]],
+  ['get_5fround_5fnumber_23',['get_round_number',['../classgame__state.html#ab3ef836a1b3a1e2bc9e429a018c72eca',1,'game_state']]],
+  ['get_5fscores_24',['get_scores',['../classplayer.html#aef5c25a02a2fdbdb4d8270582faf5dac',1,'player']]],
+  ['get_5fstarting_5fplayer_25',['get_starting_player',['../classgame__state.html#af4c553229260e307ff1f78dd0c74506d',1,'game_state']]],
+  ['get_5ftrick_26',['get_trick',['../classgame__state.html#a472fd1721c7cc9e3689394f18c767bf9',1,'game_state']]],
+  ['get_5ftrick_5fcolor_27',['get_trick_color',['../classtrick.html#a41f315804ac73454c8e41438da20a9c3',1,'trick']]],
+  ['get_5ftrick_5festimate_5fsum_28',['get_trick_estimate_sum',['../classgame__state.html#aa5263d03c85bce1e9d252e9017cbe282',1,'game_state']]],
+  ['get_5ftrick_5fnumber_29',['get_trick_number',['../classgame__state.html#a3fce12f31ad0aab82b0d2da90e3e8e15',1,'game_state']]],
+  ['get_5ftrick_5fstarting_5fplayer_30',['get_trick_starting_player',['../classgame__state.html#aa40554d105939c5dce934daaa858c242',1,'game_state']]],
+  ['get_5ftrump_5fcard_5fvalue_31',['get_trump_card_value',['../classgame__state.html#a115a9b1dbb65db44669363b407aa62ac',1,'game_state']]],
+  ['get_5ftrump_5fcolor_32',['get_trump_color',['../classtrick.html#a69c49e2968abb235a6c7148cb05b0e64',1,'trick::get_trump_color()'],['../classgame__state.html#abdf6c5116ed643773d676c90a05e6fe4',1,'game_state::get_trump_color()']]],
+  ['get_5fvalue_33',['get_value',['../classcard.html#a2baf8dfef09ac8c1a67b34c2e67186c3',1,'card']]],
+  ['get_5fwinner_34',['get_winner',['../classtrick.html#a4b93ae88c17db486d975408cd8cfad1b',1,'trick']]],
+  ['getmainthreadeventhandler_35',['getMainThreadEventHandler',['../class_game_controller.html#abec8c73ea01e4b7e01b2ca1d932e0c16',1,'GameController']]]
 ];
diff --git a/html/search/all_c.js b/html/search/all_c.js
index 928b7ae1a56f08b645aa389ee18c8094d03b857d..13f0585d79017d19f1b2e3d695013cd914be98a9 100644
--- a/html/search/all_c.js
+++ b/html/search/all_c.js
@@ -1,38 +1,6 @@
 var searchData=
 [
-  ['game_0',['Game',['../index.html#autotoc_md14',1,'3 Run the Game'],['../index.html#autotoc_md16',1,'4 Play the Game']]],
-  ['game_5finstance_1',['game_instance',['../classgame__instance.html',1,'game_instance'],['../classgame__instance.html#a2b1d00adf8c933a98698f972827e48b9',1,'game_instance::game_instance()']]],
-  ['game_5finstance_5fmanager_2',['game_instance_manager',['../classgame__instance__manager.html',1,'']]],
-  ['game_5fstate_3',['game_state',['../classgame__state.html',1,'game_state'],['../classgame__state.html#a0c10b830e222d726557c3c33685c595a',1,'game_state::game_state()']]],
-  ['gamecontroller_4',['GameController',['../class_game_controller.html',1,'']]],
-  ['gamewindow_5',['GameWindow',['../class_game_window.html',1,'']]],
-  ['get_5fcards_6',['get_cards',['../classhand.html#ad104b0376b1a13d987f349dd524ca47f',1,'hand']]],
-  ['get_5fcards_5fand_5fplayers_7',['get_cards_and_players',['../classtrick.html#a1d75f9e8fc94fd122adfc39a20089268',1,'trick']]],
-  ['get_5fcolor_8',['get_color',['../classcard.html#ab033bc0e71b09d3cf3ac28c2f1fbde18',1,'card']]],
-  ['get_5fcurrent_5fplayer_9',['get_current_player',['../classgame__state.html#a2d16f420a8aa651685461a5efb8bb600',1,'game_state']]],
-  ['get_5fgame_5fid_10',['get_game_id',['../classplayer.html#afeb6c5483a59042fcc4a3a2aed6a6a2c',1,'player']]],
-  ['get_5fgame_5fstate_11',['get_game_state',['../classgame__instance.html#a852c73a12031d7fbd2095530df595c5c',1,'game_instance']]],
-  ['get_5fhand_12',['get_hand',['../classplayer.html#af333dcbf7123726c9bda3ab94ba9ee6d',1,'player']]],
-  ['get_5fid_13',['get_id',['../classgame__instance.html#a72cd93738171ffc856c3d77df5f967da',1,'game_instance']]],
-  ['get_5flast_5ftrick_14',['get_last_trick',['../classgame__state.html#a4327f753f1f5341f9fe3774ea3fbc99b',1,'game_state']]],
-  ['get_5fmax_5fround_5fnumber_15',['get_max_round_number',['../classgame__state.html#aa75c4da6c0056e48e5040be8127d7473',1,'game_state']]],
-  ['get_5fnof_5fcards_16',['get_nof_cards',['../classhand.html#adc90d109b7b564a0dbca0b0798c99641',1,'hand::get_nof_cards()'],['../classplayer.html#a457c5ab90b0ecd610eead66b41c8333a',1,'player::get_nof_cards() const noexcept']]],
-  ['get_5fnof_5fpredicted_17',['get_nof_predicted',['../classplayer.html#a40333c302ff51707749c544930fb80aa',1,'player']]],
-  ['get_5fnof_5ftricks_18',['get_nof_tricks',['../classplayer.html#a5e3d1374aee685b08a29d0ac7cec3df4',1,'player']]],
-  ['get_5fnumber_5fof_5fremaining_5fcards_19',['get_number_of_remaining_cards',['../classdeck.html#ae1c7a4174108a14cb1180de1afdcb6d6',1,'deck']]],
-  ['get_5fplayer_5fname_20',['get_player_name',['../classplayer.html#a42d01dcf4cdbd452fc5dcaf5e6f21773',1,'player']]],
-  ['get_5fplayers_21',['get_players',['../classgame__state.html#abcaccd551f938f961d12266e34c037d2',1,'game_state']]],
-  ['get_5fround_5fnumber_22',['get_round_number',['../classgame__state.html#ab3ef836a1b3a1e2bc9e429a018c72eca',1,'game_state']]],
-  ['get_5fscores_23',['get_scores',['../classplayer.html#aef5c25a02a2fdbdb4d8270582faf5dac',1,'player']]],
-  ['get_5fstarting_5fplayer_24',['get_starting_player',['../classgame__state.html#af4c553229260e307ff1f78dd0c74506d',1,'game_state']]],
-  ['get_5ftrick_25',['get_trick',['../classgame__state.html#a472fd1721c7cc9e3689394f18c767bf9',1,'game_state']]],
-  ['get_5ftrick_5fcolor_26',['get_trick_color',['../classtrick.html#a41f315804ac73454c8e41438da20a9c3',1,'trick']]],
-  ['get_5ftrick_5festimate_5fsum_27',['get_trick_estimate_sum',['../classgame__state.html#aa5263d03c85bce1e9d252e9017cbe282',1,'game_state']]],
-  ['get_5ftrick_5fnumber_28',['get_trick_number',['../classgame__state.html#a3fce12f31ad0aab82b0d2da90e3e8e15',1,'game_state']]],
-  ['get_5ftrick_5fstarting_5fplayer_29',['get_trick_starting_player',['../classgame__state.html#aa40554d105939c5dce934daaa858c242',1,'game_state']]],
-  ['get_5ftrump_5fcard_5fvalue_30',['get_trump_card_value',['../classgame__state.html#a115a9b1dbb65db44669363b407aa62ac',1,'game_state']]],
-  ['get_5ftrump_5fcolor_31',['get_trump_color',['../classtrick.html#a69c49e2968abb235a6c7148cb05b0e64',1,'trick::get_trump_color()'],['../classgame__state.html#abdf6c5116ed643773d676c90a05e6fe4',1,'game_state::get_trump_color()']]],
-  ['get_5fvalue_32',['get_value',['../classcard.html#a2baf8dfef09ac8c1a67b34c2e67186c3',1,'card']]],
-  ['get_5fwinner_33',['get_winner',['../classtrick.html#a4b93ae88c17db486d975408cd8cfad1b',1,'trick']]],
-  ['getmainthreadeventhandler_34',['getMainThreadEventHandler',['../class_game_controller.html#abec8c73ea01e4b7e01b2ca1d932e0c16',1,'GameController']]]
+  ['hand_0',['hand',['../classhand.html',1,'hand'],['../classhand.html#ae8d7de2589266f57271ac191dab8cd64',1,'hand::hand()'],['../classhand.html#afb908b5b24b92eec58c6d39739093a84',1,'hand::hand(const std::string &amp;id, const std::vector&lt; card * &gt; &amp;cards)'],['../classhand.html#a4820b774c5446b60f74c6458691d1de8',1,'hand::hand(const std::string &amp;id)']]],
+  ['has_5fleft_5fgame_1',['has_left_game',['../classplayer.html#aac1b87de3b686d8ee1049269f6c9f272',1,'player']]],
+  ['host_20server_2',['host server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]]
 ];
diff --git a/html/search/all_d.js b/html/search/all_d.js
index 4a70403943634d8865741b046c0cb5fdef5a30b7..190e167ac0648a07a9c96fd8eae6b53295ef4041 100644
--- a/html/search/all_d.js
+++ b/html/search/all_d.js
@@ -1,5 +1,14 @@
 var searchData=
 [
-  ['hand_0',['hand',['../classhand.html',1,'hand'],['../classhand.html#ae8d7de2589266f57271ac191dab8cd64',1,'hand::hand()'],['../classhand.html#afb908b5b24b92eec58c6d39739093a84',1,'hand::hand(const std::string &amp;id, const std::vector&lt; card * &gt; &amp;cards)'],['../classhand.html#a4820b774c5446b60f74c6458691d1de8',1,'hand::hand(const std::string &amp;id)']]],
-  ['has_5fleft_5fgame_1',['has_left_game',['../classplayer.html#aac1b87de3b686d8ee1049269f6c9f272',1,'player']]]
+  ['imagepanel_0',['ImagePanel',['../class_image_panel.html',1,'']]],
+  ['init_1',['init',['../class_game_controller.html#a8889bad76bc35487d3391fb8a5791616',1,'GameController']]],
+  ['inputfield_2',['InputField',['../class_input_field.html',1,'']]],
+  ['instructions_3',['Instructions',['../md__r_e_a_d_m_e.html#autotoc_md6',1,'2 Compile Instructions'],['../index.html#autotoc_md26',1,'2 Compile Instructions']]],
+  ['ip_20address_20to_20host_20server_4',['IP address to host server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]],
+  ['is_5fempty_5',['is_empty',['../classdeck.html#a6aef528ff7b9c608863cc77c19b7882d',1,'deck']]],
+  ['is_5festimation_5fphase_6',['is_estimation_phase',['../classgame__state.html#a88d19342ee76acc4660b3e56e8c126eb',1,'game_state']]],
+  ['is_5ffinished_7',['is_finished',['../classgame__state.html#a9b83de8a89e3bb506184492d22c3cf45',1,'game_state::is_finished()'],['../classgame__instance.html#a5a080dfced3d2d1c697e36160b996a9c',1,'game_instance::is_finished()']]],
+  ['is_5ffull_8',['is_full',['../classgame__state.html#ae161c283e275a57d71834754d11e9e40',1,'game_state::is_full()'],['../classgame__instance.html#a77d1f40b8727c74f278efe9168f26831',1,'game_instance::is_full()']]],
+  ['is_5fplayer_5fin_5fgame_9',['is_player_in_game',['../classgame__state.html#a371d6a6d84395b90c15d84549b05d553',1,'game_state']]],
+  ['is_5fstarted_10',['is_started',['../classgame__state.html#aa0092c41779f38eba5e921e43b38559c',1,'game_state::is_started()'],['../classgame__instance.html#a2c8a8be71f8c3016075cc08768ebbb64',1,'game_instance::is_started()']]]
 ];
diff --git a/html/search/all_e.js b/html/search/all_e.js
index 955901c4861aa4f877e34c7ff3eabfc63f33b6c5..29ca06cb7085e5b5275ae95810d06bae0ca258eb 100644
--- a/html/search/all_e.js
+++ b/html/search/all_e.js
@@ -1,13 +1,5 @@
 var searchData=
 [
-  ['imagepanel_0',['ImagePanel',['../class_image_panel.html',1,'']]],
-  ['init_1',['init',['../class_game_controller.html#a8889bad76bc35487d3391fb8a5791616',1,'GameController']]],
-  ['inputfield_2',['InputField',['../class_input_field.html',1,'']]],
-  ['instructions_3',['2 Compile Instructions',['../index.html#autotoc_md6',1,'']]],
-  ['is_5fempty_4',['is_empty',['../classdeck.html#a6aef528ff7b9c608863cc77c19b7882d',1,'deck']]],
-  ['is_5festimation_5fphase_5',['is_estimation_phase',['../classgame__state.html#a88d19342ee76acc4660b3e56e8c126eb',1,'game_state']]],
-  ['is_5ffinished_6',['is_finished',['../classgame__state.html#a9b83de8a89e3bb506184492d22c3cf45',1,'game_state::is_finished()'],['../classgame__instance.html#a5a080dfced3d2d1c697e36160b996a9c',1,'game_instance::is_finished()']]],
-  ['is_5ffull_7',['is_full',['../classgame__state.html#ae161c283e275a57d71834754d11e9e40',1,'game_state::is_full()'],['../classgame__instance.html#a77d1f40b8727c74f278efe9168f26831',1,'game_instance::is_full()']]],
-  ['is_5fplayer_5fin_5fgame_8',['is_player_in_game',['../classgame__state.html#a371d6a6d84395b90c15d84549b05d553',1,'game_state']]],
-  ['is_5fstarted_9',['is_started',['../classgame__state.html#aa0092c41779f38eba5e921e43b38559c',1,'game_state::is_started()'],['../classgame__instance.html#a2c8a8be71f8c3016075cc08768ebbb64',1,'game_instance::is_started()']]]
+  ['join_5fgame_5frequest_0',['join_game_request',['../classjoin__game__request.html',1,'']]],
+  ['json_5futils_1',['json_utils',['../classjson__utils.html',1,'']]]
 ];
diff --git a/html/search/all_f.js b/html/search/all_f.js
index 29ca06cb7085e5b5275ae95810d06bae0ca258eb..08ea62550950761a0057ad6931bc9b72f8086f90 100644
--- a/html/search/all_f.js
+++ b/html/search/all_f.js
@@ -1,5 +1,6 @@
 var searchData=
 [
-  ['join_5fgame_5frequest_0',['join_game_request',['../classjoin__game__request.html',1,'']]],
-  ['json_5futils_1',['json_utils',['../classjson__utils.html',1,'']]]
+  ['leave_5fgame_5frequest_0',['leave_game_request',['../classleave__game__request.html',1,'']]],
+  ['leavegame_1',['leaveGame',['../class_game_controller.html#a8d42b2e41759bfd65cdebad87437369e',1,'GameController']]],
+  ['local_20ip_20address_20to_20host_20server_2',['local IP address to host server',['../md__r_e_a_d_m_e.html#autotoc_md18',1,'Get local IP address to host server'],['../index.html#autotoc_md38',1,'Get local IP address to host server']]]
 ];
diff --git a/html/search/functions_2.js b/html/search/functions_2.js
index eca9207c93542ed12837f6d49ddecde24a32d882..0dd76f55481694dd21ee57b9fc6f07b9c26dfa8d 100644
--- a/html/search/functions_2.js
+++ b/html/search/functions_2.js
@@ -1,6 +1,5 @@
 var searchData=
 [
   ['card_0',['card',['../classcard.html#a764d65641c619aedf1842a30e54905b7',1,'card']]],
-  ['closegamewindow_1',['closeGameWindow',['../class_game_controller.html#a21eea505305d56439efb835e1e148c2f',1,'GameController']]],
-  ['connecttoserver_2',['connectToServer',['../class_game_controller.html#a023da21da545374ee46fb873149976c4',1,'GameController']]]
+  ['connecttoserver_1',['connectToServer',['../class_game_controller.html#a023da21da545374ee46fb873149976c4',1,'GameController']]]
 ];
diff --git a/html/search/pages_0.js b/html/search/pages_0.js
index 94587226b625efd72bad441a72fb761cde28cf4b..ec825748fa237d16980dc903ecc750030f3de4eb 100644
--- a/html/search/pages_0.js
+++ b/html/search/pages_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['engineering_20project_20wizard_0',['Software Engineering Project - Wizard',['../index.html',1,'']]]
+  ['engineering_20project_20wizard_0',['Engineering Project Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]]
 ];
diff --git a/html/search/pages_1.js b/html/search/pages_1.js
index 7726cd4e9848b83b4e4d2555b00871eda4aca729..aafc1a8cc3ff7b63e6ccae897a64cf9c56fab5d8 100644
--- a/html/search/pages_1.js
+++ b/html/search/pages_1.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['project_20wizard_0',['Software Engineering Project - Wizard',['../index.html',1,'']]]
+  ['project_20wizard_0',['Project Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]]
 ];
diff --git a/html/search/pages_2.js b/html/search/pages_2.js
index 27d3927a7b2da14868ecf4c189370fab59671465..59b7ee487f40ff602d0eb1fd1bf2a8d64ed4afd7 100644
--- a/html/search/pages_2.js
+++ b/html/search/pages_2.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['software_20engineering_20project_20wizard_0',['Software Engineering Project - Wizard',['../index.html',1,'']]]
+  ['software_20engineering_20project_20wizard_0',['Software Engineering Project Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]]
 ];
diff --git a/html/search/pages_3.js b/html/search/pages_3.js
index d98b7bf433df6a42144500f102a53596626c440c..b5327484b604de8ab273f86b3c1059d36e982842 100644
--- a/html/search/pages_3.js
+++ b/html/search/pages_3.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['wizard_0',['Software Engineering Project - Wizard',['../index.html',1,'']]]
+  ['wizard_0',['Wizard',['../md__r_e_a_d_m_e.html',1,'Software Engineering Project - Wizard'],['../index.html',1,'Software Engineering Project - Wizard']]]
 ];
diff --git a/html/search/searchdata.js b/html/search/searchdata.js
index 24c398a67a73c5c8228b70b39fd9202c3ffbc004..463bccece2cef4f4cce44975c486528f36c093d7 100644
--- a/html/search/searchdata.js
+++ b/html/search/searchdata.js
@@ -1,6 +1,6 @@
 var indexSectionsWithContent =
 {
-  0: "012345abcdefghijlmoprstuw~🚀",
+  0: "01234abcdefghijlmoprstuw~🚀",
   1: "bcdefghijlmprstuw",
   2: "abcdefghilmprstuw~",
   3: "epsw"
diff --git a/src/client/GameController.cpp b/src/client/GameController.cpp
index 0b066643b2591e0ae0446a3b81e71f80b5d0f9fd..90c27ab8f7d51ab7fd58aa73a1cd3d3efc546dc4 100644
--- a/src/client/GameController.cpp
+++ b/src/client/GameController.cpp
@@ -316,9 +316,4 @@ void GameController::showGameOverMessage() {
     if(buttonClicked == wxID_OK) {
         GameController::_gameWindow->Close();
     }
-}
-
-void GameController::closeGameWindow()
-{
-    GameController::_gameWindow->Close();
-}
+}
\ No newline at end of file
diff --git a/src/client/GameController.h b/src/client/GameController.h
index eecbbccead7ac905c4d50a15e723e05f71ab0b8f..26413bbde5c8cf1303d79696f8ba4768a0f1be7a 100644
--- a/src/client/GameController.h
+++ b/src/client/GameController.h
@@ -90,10 +90,6 @@ public:
      * @brief Shows message at the end of the game that the game has ended and states the winner.
      */
     static void showGameOverMessage();
-    /**
-     * @brief Closes game window.
-     */
-    static void closeGameWindow();
 
 private:
     static GameWindow* _gameWindow; ///< The window which contains all panels shown to the user.
diff --git a/src/client/panels/MainGamePanelWizard.cpp b/src/client/panels/MainGamePanelWizard.cpp
index 8aa0f928c0efa9000425ebc7f6f8dfc16a6c35af..21c289a2e733ff7c496064f4ef19a17d269f115e 100644
--- a/src/client/panels/MainGamePanelWizard.cpp
+++ b/src/client/panels/MainGamePanelWizard.cpp
@@ -104,7 +104,7 @@ void MainGamePanelWizard::buildGameState(game_state* gameState, player* me)
     }
     else if (me->has_left_game() == true)
     {
-        GameController::closeGameWindow();
+        GameController::showGameOverMessage();
         return;
     }
     else {