# Protocole de communication Snecc
## Introduction
L'application Snake est en client-serveur. Le serveur gère les mécanismes de jeu et envoie les informations relatives à l'état du jeu aux clients. En outre les clients envoie les entrées faites par le joueur.
## Format classique des messages
| Type de message | Longueur du message | Données |
| -------- | -------- | -------- |
| 1 octet | 2 octets | n octets |
Les données sont codées sur différents octets en _little endian_.
## Les types de messages
### Player_id
| Type de message | Longueur du message | Données |
| -------- | -------- | -------- |
| 0 | 1 | id (1 octet) |
Ce message fournit au client son ID.
### Game_params
| Type de message | Longueur du message | Données |
| -------- | -------- | -------- |
| 1 | $$8 \times n_{\text{joueurs}} + 6 $$ | n octets |
Ce sont les paramètres initiaux du jeu.
#### Détails sur les données
| Index (octets) | Taille (octets) | Contenu |
| -------- | -------- | -------- |
| 0 | 2 | Taille de la map en blocs |
| 2 | 2 | Taille d'un bloc en pixels |
| 4 | 1 | Vitesse initiale (pas utilisé lol) |
| 5 | 1 | Nombre de joueurs |
| 6 | $$8 \times n_{\text{joueurs}}$$ | Concaténation des paramètres de chaque joueur |
#### Paramètres joueurs
| Index (octets) | Taille (octets) | Contenu |
| -------- | -------- | -------- |
| 0 | 1 | Identifiant du joueur |
| 1 | 3 | Couleur RGB du serpent |
| 4 | 2 | Position initiale x0 |
| 6 | 2 | Position initiale y0 |
### Frame
| Type de message | Longueur du message | Données |
| -------- | -------- | -------- |
| 3 | $$2 + 5 \times n_{\text{nourriture}} + \sum_{i=1}^{n_{\text{joueurs}}} (4 + 4 \times n^i_{noeuds})$$ | Nourritures puis Serpents |
Ce message contient un état complet du jeu. Cela permet aux clients d'êtres synchronisés.
#### Détails sur les données
| Index (octets) | Taille (octets) | Contenu |
| -------- | -------- | -------- |
| 0 | $1$ | Nombre de nourritures |
| 1 | $5*n_{nourriture}$ | Types et position de chaque nourritures |
| $$1 + 5*n_{nourriture}$$ | $1$ | Nombre de serpents |
| $$2 + 5*n_{nourriture}$$ | $$\sum_{i=1}^{n_{\text{joueurs}}} (4 + 4 \times n^i_{noeuds})$$ | Etats et positions de chaque serpents |
#### Types et positions des nourritures
| Index (octets) | Taille (octets) | Contenu |
| -------- | -------- | -------- |
| 0 | 1 | Type de nourriture |
| 1 | 2 | Position x |
| 3 | 2 | Position y |
#### Etat et position d'un serpent
| Index (octets) | Taille (octets) | Contenu |
| -------- | -------- | -------- |
| 0 | 1 | ID du serpent |
| 1 | 1 | 1 si le serpent est mort, 0 sinon |
| 2 | 1 | Quantité de nourriture dans l'estomac du serpent (allongement à venir) |
| 3 | 1 | Longueur en noeuds du serpent |
| 4 | $$4 * n_{noeuds}$$ | Positions des noeuds des serpents |
#### Noeud d'un serpent
| Index (octets) | Taille (octets) | Contenu |
| -------- | -------- | -------- |
| 0 | 2 | Position x |
| 2 | 2 | Position y |
### Move
| Type de message | Longeur du message | Données |
| -------- | -------- | -------- |
| 4 | 1 | move_byte |
```rust
let move_byte: u8 = match player_move {
Move::Up => 1,
Move::Down => 2,
Move::Left => 3,
Move::Right => 4,
};
```
C'est le seul message envoyé du client au serveur. Il code l'entrée clavier du joueur.