Aller au contenu

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_ai par 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.