Protocole — Vue d'ensemble¶
Le serveur Zappy expose un seul port TCP (par défaut 4242) sur lequel se
connectent deux familles de clients distinctes :
- l'IA (les joueurs autonomes, un processus
zappy_aipar drone) ; - le GUI (le visualiseur graphique
zappy_gui).
Les deux canaux partagent le même port et la même mécanique de transport, mais parlent deux dialectes textuels différents. Le serveur distingue le type de client dès la première ligne reçue après le message de bienvenue (voir Handshake).
flowchart LR
AI1["zappy_ai (drone)"] -- "texte, \\n" --> S(("Serveur\nport 4242"))
AI2["zappy_ai (drone)"] -- "texte, \\n" --> S
GUI["zappy_gui"] -- "texte, \\n" --> S
S -- "réponses + événements" --> AI1
S -- "événements monde" --> GUI
Transport¶
Lignes de texte terminées par \n
Toute la communication est textuelle, ligne par ligne. Chaque message
(requête ou réponse) est terminé par un saut de ligne \n. Le serveur
tolère et retire un \r final éventuel (NetworkBuffer::popLine,
server/srcs/network/NetworkBuffer.cpp). Les sockets sont non bloquantes
des deux côtés.
Le serveur maintient un tampon de lecture borné à MAX_BUFFER_SIZE = 65536
octets par client (server/srcs/network/AClient.hpp) ; un dépassement entraîne
la fermeture de la connexion.
Conventions communes¶
Identifiants¶
Les identifiants de joueurs et d'œufs sont préfixés par # sur le canal GUI
(par exemple #3). Le canal IA, lui, ne manipule jamais d'identifiants : un
drone ne connaît que sa propre vue locale.
Encodage des directions (GUI)¶
Les orientations des joueurs sont transmises au GUI sous forme d'entiers :
| Code | Direction |
|---|---|
1 |
Nord |
2 |
Est |
3 |
Sud |
4 |
Ouest |
(directionToGui, server/srcs/protocol/GUIProtocol.cpp.)
Index des ressources¶
Les ressources sont toujours énumérées dans cet ordre fixe, aussi bien dans les
contenus de tuiles (bct, Look) que dans les inventaires (pin,
Inventory). L'index est utilisé tel quel par les événements pgt/pdr :
| Index | Ressource |
|---|---|
0 |
food (nourriture) |
1 |
linemate |
2 |
deraumere |
3 |
sibur |
4 |
mendiane |
5 |
phiras |
6 |
thystame |
(resourceToGuiId, server/srcs/protocol/GUIProtocol.cpp ; enum Resource,
server/srcs/world/Tile.hpp.)
Direction sonore d'un broadcast (IA)¶
Un message reçu par un drone (message K, <texte>) est accompagné d'un
K ∈ 0..8 indiquant la tuile/le son d'où il provient relativement à
l'orientation du drone récepteur. K = 0 signifie « même tuile » ; 1..8
indiquent les directions autour du drone, en partant de devant et en tournant
dans le sens trigonométrique (server/srcs/algorithms/BroadcastAlgo.cpp).
Unités de temps et fréquence¶
Le temps du jeu est exprimé en unités de temps. Une unité dure
1000 / f millisecondes, où f est la fréquence du serveur (option -f,
par défaut 100). Une fréquence plus élevée accélère donc le jeu. Chaque
commande IA a un délai d'exécution exprimé en unités de temps (voir
IA ↔ Serveur). Le GUI peut modifier la fréquence à chaud via
sst (voir GUI ↔ Serveur). Référence :
server/srcs/scheduler/Scheduler.cpp.
Limite des commandes en vol (IA)¶
10 commandes maximum en attente
Un drone ne peut avoir au plus 10 commandes en attente de réponse
simultanément. Toute commande supplémentaire reçoit immédiatement ko
(server/srcs/core/AICommandDispatcher.cpp). Côté IA, la file
CommandQueue applique la même borne MAX_PENDING_COMMANDS = 10
(ai/src/network/command_queue.py).
Pages du protocole¶
- Handshake — la phase de connexion IA et GUI.
- IA ↔ Serveur — les 12 commandes du drone et les messages non sollicités.
- GUI ↔ Serveur — les requêtes et les événements du visualiseur.
Voir aussi Serveur > Mécaniques et IA > Couche protocole.