diff --git a/README.md b/README.md index 08f3b054721d0a286bdf087e6b931351a35490f2..79fefe407b530bfff20a436f55cf8c42b80ef16d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Software Engineering Project - Wizard -Welcome to **Wizard**, a C++ implementation of the classic card game. Compete with your friends in exciting multiplayer gameplay! +Welcome to **Wizard**, a C++ implementation of the classic card game. Compete with your friends in exciting multiplayer +gameplay! <div style="display: flex; align-items: center;"> <img src="./assets/wizard_logo.png" alt="Wizard Logo" style="height: 150px; margin-right: 20px;"> @@ -15,16 +16,93 @@ Welcome to **Wizard**, a C++ implementation of the classic card game. Compete wi --- -You can read the game's rules [here](https://www.amigo.games/content/ap/rule/19420--031-2019-Wizard_Manual_002_LAYOUT[1].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. +You can read the game's rules [here](https://www.amigo.games/content/ap/rule/19420--031-2019-Wizard_Manual_002_LAYOUT[1].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 +--- + +## 1 Overview -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 **server** and a **client**, each with their own main.cpp file. Each player can run his client and connect to the server in the same local network. +The game and source files are available on GitLab on the main branch. The game was developed based on the provided 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 the same server in the same local network. + +--- ## 2 Compile Instructions + +This project only works on UNIX systems (Linux / macOS). We thus only explain the how to compile the game on these +systems. The following description was tested on Ubuntu 20.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 20.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.0-gtk3-dev` (install wxwidgets, use libwxgtk3.2-dev on Ubuntu 24.04) +4. `sudo apt-get install cmake` (install cmake) + +#### 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 20.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 (if not yet there). 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 + +Enjoy the game! + + + + + + + + ### 4.1 Connection Panel 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. - If the **player's move was valid**, 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. diff --git a/assets/JunicodeBold.ttf b/assets/JunicodeBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..62d497d80a84929bf6baf7954e00b25b4c2df36a Binary files /dev/null and b/assets/JunicodeBold.ttf differ diff --git a/assets/MagicSchoolOne.ttf b/assets/MagicSchoolOne.ttf new file mode 100644 index 0000000000000000000000000000000000000000..80430c0aaff35b1455a708b99ea00fcd44a84593 Binary files /dev/null and b/assets/MagicSchoolOne.ttf differ diff --git a/scripts/compile_macos.sh b/scripts/compile_macos.sh new file mode 100644 index 0000000000000000000000000000000000000000..a92f667e6b1155fe45d80745d01b2c9b9a27a478 --- /dev/null +++ b/scripts/compile_macos.sh @@ -0,0 +1,52 @@ +#!/bin/zsh + +# path to the assets folder containing the .ttf files +ASSETS_DIR="./assets" +FONT_NAME1="JunicodeBold.ttf" +FONT_NAME2="MagicSchoolOne.ttf" + +# path to the system fonts directory +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + FONT_DIR="$HOME/.fonts" +elif [[ "$OSTYPE" == "darwin"* ]]; then + FONT_DIR="$HOME/Library/Fonts" +else + echo "Unsupported operating system. Exiting." + exit 1 +fi + +# check if the .ttf files exists +if [[ ! -f "$ASSETS_DIR/$FONT_NAME1" ]]; then + echo "Font file $FONT_NAME1 not found in $ASSETS_DIR. Exiting." + exit 1 +fi +if [[ ! -f "$ASSETS_DIR/$FONT_NAME2" ]]; then + echo "Font file $FONT_NAME2 not found in $ASSETS_DIR. Exiting." + exit 1 +fi + +# copy font 1 +cp "$ASSETS_DIR/$FONT_NAME1" "$FONT_DIR" +# refresh cache +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + fc-cache -f -v +fi + +# copy font 2 +cp "$ASSETS_DIR/$FONT_NAME2" "$FONT_DIR" +# refresh cache +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + fc-cache -f -v +fi + +# compile code +cd sockpp/ || exit +mkdir cmake-build-debug +cd cmake-build-debug || exit +cmake .. +make +cd ../.. +mkdir cmake-build-debug +cd cmake-build-debug || exit +cmake .. +make \ No newline at end of file diff --git a/scripts/compile_ubuntu.sh b/scripts/compile_ubuntu.sh new file mode 100644 index 0000000000000000000000000000000000000000..9c10f128dd6520d8bb8c1af9b832264a3d4117e0 --- /dev/null +++ b/scripts/compile_ubuntu.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# path to the assets folder containing the .ttf files +ASSETS_DIR="./assets" +FONT_NAME1="JunicodeBold.ttf" +FONT_NAME2="MagicSchoolOne.ttf" + +# path to the system fonts directory +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + FONT_DIR="$HOME/.fonts" +elif [[ "$OSTYPE" == "darwin"* ]]; then + FONT_DIR="$HOME/Library/Fonts" +else + echo "Unsupported operating system. Exiting." + exit 1 +fi + +# check if the .ttf files exists +if [[ ! -f "$ASSETS_DIR/$FONT_NAME1" ]]; then + echo "Font file $FONT_NAME1 not found in $ASSETS_DIR. Exiting." + exit 1 +fi +if [[ ! -f "$ASSETS_DIR/$FONT_NAME2" ]]; then + echo "Font file $FONT_NAME2 not found in $ASSETS_DIR. Exiting." + exit 1 +fi + +# copy font 1 +cp "$ASSETS_DIR/$FONT_NAME1" "$FONT_DIR" +# refresh cache +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + fc-cache -f -v +fi + +# copy font 2 +cp "$ASSETS_DIR/$FONT_NAME2" "$FONT_DIR" +# refresh cache +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + fc-cache -f -v +fi + +# compile code +cd sockpp/ || exit +mkdir cmake-build-debug +cd cmake-build-debug || exit +cmake .. +make +cd ../.. +mkdir cmake-build-debug +cd cmake-build-debug || exit +cmake .. +make \ No newline at end of file diff --git a/scripts/prepare_macos.sh b/scripts/prepare_macos.sh new file mode 100644 index 0000000000000000000000000000000000000000..a4428c7974fa7e07731f62ffdcabea619a5d29ed --- /dev/null +++ b/scripts/prepare_macos.sh @@ -0,0 +1,4 @@ +#!/bin/zsh +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +brew install cmake +brew install wxwidgets \ No newline at end of file diff --git a/scripts/prepare_ubuntu.sh b/scripts/prepare_ubuntu.sh new file mode 100644 index 0000000000000000000000000000000000000000..c398c5643585e56ef82bdd07961b86d23583407d --- /dev/null +++ b/scripts/prepare_ubuntu.sh @@ -0,0 +1,5 @@ +#!/bin/bash +sudo apt-get update +sudo apt-get install build-essential +sudo apt-get install libwxgtk3.0-gtk3-dev +sudo apt-get install cmake \ No newline at end of file