Limitations connues¶
À propos de cette page
Cette page documente l'état réel du code tel qu'il existe aujourd'hui :
fonctions laissées en stub, écarts entre le code et la documentation
historique, et bugs potentiels identifiés lors de la relecture du dépôt.
L'objectif est d'offrir une référence honnête et précise, pas un réquisitoire :
chaque point est décrit comme un état actuel, une limitation connue ou un
travail futur, avec le fichier:ligne quand il est connu et l'impact pratique.
Le code reste fonctionnel pour le cas d'usage nominal ; les éléments listés ici concernent des branches non câblées, des incohérences de représentation, ou des fonctionnalités annoncées mais non réalisées de bout en bout.
IA (Python)¶
L'IA (ai/) est largement implémentée, mais son README la qualifie encore de
« squelette ». Plusieurs stubs et incohérences subsistent.
Stubs (provoquent une erreur si atteints)¶
Fonctions non implémentées
| Élément | Emplacement | Impact |
|---|---|---|
parse_broadcast |
ai/src/protocol/parser.py:102 |
Lève NotImplementedError. Les broadcasts entrants message K, text ne sont pas traités de bout en bout : le ralliement par le son n'est pas réalisé. |
ForkState (4 méthodes) |
ai/src/strategy/states/fork.py:27,33,37,41 |
Toutes les méthodes lèvent NotImplementedError. FORK est enregistré dans la FSM mais aucune transition n'y mène ; y entrer planterait. La stratégie de reproduction (Fork/Connect_nbr) n'est pas implémentée. |
tile_index_to_relative_coord |
ai/src/state/vision.py:20 |
Stub mort : la géométrie équivalente est implémentée en ligne dans WorldMap.update_from_look. Jamais appelé, donc sans effet runtime. |
Voir IA > Stratégie (FSM) et IA > Couche protocole.
Code implémenté mais non câblé¶
Présent et testé, mais sans appelant
Le paquet team/ complet (crypto.py, protocol.py, decoy.py) est
implémenté et couvert par des tests, mais n'est référencé que depuis
team/ lui-même : aucun appelant dans le réseau ou la stratégie. Les
communications d'équipe chiffrées et les leurres (decoys) ne sont donc pas
utilisés à l'exécution. Voir IA > Coordination d'équipe.
Autres éléments implémentés mais inutilisés :
pathfinding.bfs_toric— BFS torique complet, aucun appelant.pathfinding.direction_from_sound— mapping K (0–8) vers direction, inutilisé (lié à l'absence de ralliement sonore).Client.flush_output— implémenté mais jamais appelé depuis la boucle principale.CommandQueue._callbacks— stocké paradd_callbackmais jamais relu (effectivement mort).ConnectNbrResult— type de message jamais produit (carForkStateest un stub).config.DEFAULT_HOST— constante inutilisée.
Bug probable : comparaison d'unités de food¶
Seuils de food : count vs unités de temps
Les comparaisons de seuil de nourriture confrontent drone.food (un nombre
d'unités de food) à FOOD_SURVIVAL_THRESHOLD * LIFE_PER_FOOD (une valeur en
unités de temps, p. ex. 5 * 126 = 630). On compare donc un compte
(typiquement quelques unités) à une valeur en ticks (centaines), si bien que
certaines transitions risquent de ne jamais se déclencher.
Concerné dans : survive, collect, incant_prep, incant
(ai/src/strategy/states/). Voir IA > Stratégie (FSM).
Fragilité du handshake¶
do_handshake suppose une réception groupée
Dans ai/src/network/connection.py (do_handshake, ~:65), le code suppose
que CLIENT-NUM et la ligne X Y arrivent dans un seul recv
(splitlines()[0] / [1]). En cas de fragmentation TCP, cela peut lever
une IndexError. Voir IA > Réseau & file de commandes.
Écarts code / documentation¶
Le code ne correspond pas toujours aux docstrings/README
- Boucle d'E/S :
mainutilise un polling parselectavec timeout (select.select([...], [], [], 0.1)), pas le moduleselectors, contrairement à ce que suggèrent les docstrings et leREADME. La boucle principale est unwhile 1non bloquant, pas une boucle événementielle sans busy-wait. - Diagramme FSM du README : le diagramme historique (RALLY basé sur le son,
EXPLOREcomme état par défaut, boucleFORK) ne correspond pas à l'implémentation :RALLYest basé sur des coordonnées, l'état initial estsurvive, etFORKest inatteignable.
Résidus de débogage et configuration¶
Détails à nettoyer
print()de débogage laissés en place :ai/src/strategy/states/collect.py:50et:95,ai/src/strategy/states/incant_prep.py:77.pyproject.toml: la cible wheel[tool.hatch.build.targets.wheel]référencepackages=["src/zappy_ai"], un dossier inexistant. La construction du wheel est donc mal configurée — sans impact car le client est lancé directement (via./zappy_ai), pas installé.
Serveur (C++)¶
Mismatch de représentation de la food
La quantité de nourriture n'a pas la même représentation selon le consommateur :
- l'IA reçoit, dans l'
Inventory, la food sous formeunits * 126(server/srcs/commands/CmdInventory.cpp:12) ; - le GUI reçoit, via
pin, le compte brut d'unités (server/srcs/protocol/GUIProtocol.cpp:100).
De plus, le commentaire de Player.hpp décrit la food comme 1260 ticks, ce
qui ne correspond pas au modèle à 10 unités (1 unité consommée tous les
126 ticks). La durée totale est équivalente (10 × 126 = 1260), seule la
représentation diffère. Voir Serveur > Joueurs, équipes & œufs.
Événements / commandes du serveur
smg: l'événement GUIsmgest défini dansGUIProtocolmais aucun site d'appel serveur ne l'émet (semble inutilisé).Connect_nbr: la commande renvoie le nombre d'œufs d'équipe restants (non éclos) plutôt qu'un décompte séparé de slots de connexion libres. L'approximation est raisonnable mais ce n'est pas, à proprement parler, un compteur de slots libres dédié.
GUI (C++ / Raylib)¶
Version de Raylib non figée
La version de Raylib n'est figée nulle part (fichiers de build, docs,
binaire). Le build suppose une bibliothèque libraylib installée au niveau
système (lien dynamique -lraylib -lGL ...), et un pilote compatible
GL / GLSL 330 (le shader recolor.frag cible #version 330). Aucun
vendoring, find_package, pkg-config ni FetchContent. La page
GUI > Installation de Raylib décrit donc une
installation générique (paquet de distribution ou compilation depuis les
sources).
Code mort et messages ignorés
gui/raylib/Window.*: wrapper fin non compilé (absent desSRCSduMakefile) et non utilisé — code mort / hérité.mct: le handler est un no-op (le serveur développemctenbctpar tuile).sst: non géré par le GUI (pas de handler).- Le GUI ne traite que les 21 messages enregistrés dans
MessageParser. Les réponses serveursst/suc/sbpsont ignorées — ce qui est cohérent puisque le GUI n'envoie jamais queGRAPHIC.
Panneau d'info joueur (PlayerCard) stubbé
Le panneau 2D PlayerCard est câblé mais inopérant : _focusedPlayerId
(Renderer3D.hpp:53) n'est jamais positionné (reste à -1). La branche
« joueur focalisé » ne s'exécute donc jamais, et la carte est toujours dessinée
vide, avec le nom codé en dur « Salut » (PlayerCard.cpp:20).
Assets et raccourcis caméra
- Assets : de nombreux dossiers d'assets présents sur le disque sont
inutilisés ; seuls 13 dossiers d'animation plus le shader, la police
et les éléments de
playerCardsont chargés. - Caméra : la table des touches du
READMEest partiellement incohérente avec le code réel d'IsoCamera. Se fier au code et à l'indication affichée en jeu (« W/S height | A/D radius | Q/E orbit »).
Voir GUI > Rendu graphique.
Dérive build / documentation¶
Deux répertoires d'IA
Deux dossiers d'IA coexistent :
ai/est l'IA vivante (vrai code Python,zappy_ai, tests, docs) ;ia/est hérité / mort (seulement un script shell et des dossiers vides, aucun.py).
Le Makefile racine référence bien ai/. Le dossier ia/ peut être ignoré.
CI et docs
- CI : le
Jenkinsfilene construit ni ne teste le GUI : il compile et teste uniquement le serveur (build, cppcheck, doctest, couverture) et exécute la suite pytest de l'IA. Le seul workflow GitHub (.github/workflows/mirror.yml) ne fait qu'un miroir du dépôt. - Doc manquante :
gui/README.mdréférence un fichierdocs/GUI_protocol.mdqui n'existe pas.