Aller au contenu

IA ↔ Serveur

Une fois le handshake terminé, le drone pilote son joueur à l'aide de 12 commandes. Le serveur les met en file et les exécute après un délai exprimé en unités de temps (voir Vue d'ensemble). Les réponses arrivent dans l'ordre d'envoi (FIFO). Rappel : au plus 10 commandes peuvent être en vol simultanément, sinon le serveur répond ko.

Sources : server/srcs/protocol/CommandParser.cpp, server/srcs/commands/Cmd*, ai/src/protocol/commands.py.

Les 12 commandes

Commande Format envoyé Réponse serveur Délai (u.t.) Exemple
Avancer Forward ok 7 Forwardok
Tourner à droite Right ok 7 Rightok
Tourner à gauche Left ok 7 Leftok
Regarder Look [t0, t1, ...] 7 voir ci-dessous
Inventaire Inventory [food n, linemate n, ...] 1 voir ci-dessous
Émettre un son Broadcast <texte> ok 7 Broadcast hellook
Slots libres Connect_nbr <n> 0 Connect_nbr3
Pondre un œuf Fork ok 42 Forkok
Expulser Eject ok / ko 7 Ejectok
Ramasser Take <objet> ok / ko 7 Take linemateok
Déposer Set <objet> ok / ko 7 Set foodok
Incantation Incantation Elevation underway puis Current level: N (ou ko) 300 voir ci-dessous

(Délais issus des getDelay() dans server/srcs/commands/Cmd*.hpp.)

Détails

  • Connect_nbr renvoie le nombre d'œufs encore disponibles dans l'équipe du drone (slots libres), avec un délai nul (server/srcs/core/AICommandDispatcher.cpp).
  • Take <objet> / Set <objet> prennent un nom de ressource : food, linemate, deraumere, sibur, mendiane, phiras, thystame.
  • Une commande non reconnue, ou avec un argument incorrect (présent alors qu'il ne devrait pas, ou inversement), reçoit ko.

Sortie de Look

La réponse est une liste de tuiles entre crochets, séparées par des virgules. Le contenu d'une tuile liste ses objets séparés par des espaces :

  • le jeton player est répété une fois par joueur présent ;
  • puis chaque ressource est répétée autant de fois qu'il y en a sur la tuile, dans l'ordre food, linemate, deraumere, sibur, mendiane, phiras, thystame.

Une tuile vide est représentée par une chaîne vide. L'ordre des tuiles suit le cône de vision : tuile 0 = la tuile du drone, puis les rangées de profondeur croissante (2 × profondeur + 1 tuiles par rangée, de gauche à droite selon l'orientation). La profondeur maximale vaut le niveau du joueur. (server/srcs/algorithms/VisionAlgo.cpp.)

C -> S : Look
S -> C : [player, linemate, , food, , deraumere food, , , ]

Ici la tuile 0 contient le drone, la tuile 1 une linemate, la tuile 2 est vide, la tuile 3 contient de la nourriture, etc.

Sortie de Inventory

Liste nom quantité séparée par des virgules, entre crochets.

La nourriture est exprimée en unités de temps

Dans Inventory, la quantité de food est multipliée par 126 (food unités × 126), ce qui correspond au nombre d'unités de temps de vie restantes (server/srcs/commands/CmdInventory.cpp). Les autres ressources sont renvoyées en quantité brute. À noter : l'événement GUI pin renvoie au contraire la quantité brute de food — divergence documentée dans Limitations connues.

C -> S : Inventory
S -> C : [food 1260, linemate 0, deraumere 0, sibur 0, mendiane 0, phiras 0, thystame 0]

food 1260 correspond ici à 10 unités de nourriture (10 × 126).

Exemple Broadcast

C -> S : Broadcast hello world
S -> C : ok

Le texte peut contenir des espaces ; il est diffusé tel quel aux autres joueurs (voir ci-dessous) et au GUI via pbc.

Messages non sollicités (Serveur → IA)

En plus des réponses aux commandes, le serveur peut envoyer à tout moment des messages spontanés :

Message Format Signification
Broadcast reçu message K, <texte> Un autre joueur a émis un son ; K (0..8) est la direction d'arrivée relative à l'orientation du drone (0 = même tuile).
Expulsion subie eject: K Le drone a été poussé d'une tuile ; K indique la direction de la poussée.
Mort dead Le drone est mort de faim ; la connexion va être fermée.

(server/srcs/algorithms/BroadcastAlgo.cpp, server/srcs/core/Server.cpp.)

Séquence d'incantation

Lorsqu'un drone lance Incantation, le serveur répond d'abord Elevation underway, puis — après le délai de 300 unités de temps et une re-validation des conditions — envoie à chaque participant Current level: N (le nouveau niveau) en cas de succès, ou ko en cas d'échec (server/srcs/core/IncantationHandler.cpp).

C -> S : Incantation
S -> C : Elevation underway
... (300 unités de temps plus tard)
S -> C : Current level: 2

Parsing des broadcasts non implémenté côté IA

Côté IA, parse_broadcast lève NotImplementedError : les messages message K, <texte> reçus ne sont pas exploités par la stratégie actuelle. De même, le canal d'équipe chiffré (ai/src/team/) n'est pas branché. Voir Limitations connues et IA > Couche protocole. Référence : ai/src/protocol/parser.py.