Site principal. RSS. Table des matières.

Geeky Goblin Productions

Psychanalyse d'un codeur : Léni

Bonjour camarades !

Je suis Natir, je suis responsable du développement du système de jeu pour Ned et les maki. En gros, c'est moi qui me dispute avec Ned J.

Il a toujours quelque-chose à ajouter, qui n'était pas prévu dans la roadmap. C'est de l'oppression !

Ah oui… Lui, c'est Léni, mon pin's à l'effigie de Lénine. Certains ont probablement entendu parler de la méthode dite du canard en plastique ; Il y a même un article de la Wikipédia qui lui est consacré, c'est forcément vrai… Présentons rapidement la chose : quand on a un problème, si on énonce à haute voix les tenants et aboutissants du problème, on arrive plus facilement à trouver la solution. Malheureusement, on travaille souvent seul ou on ne peut pas vraiment déranger les gens avec des problèmes qu'ils ne comprennent pas : ils risqueraient de répondre aux questions — ou plutôt de tenter d'y répondre… n'est-ce pas Ned J. ?

Jusqu'a présent, je parlais à mon pin's a l'effigie de Lénine — oui, j'ai un pin's à son effigie, une robe de chambre et un mug rouge aussi — mais il commence à être un peu usé. Quand je suis énervé ou que j'ai trop de vodka dans le sang, je le lance contre les murs. Et vu que le blog des GGP est là, je me suis dit que plutôt que de parler a un pin's, j'allais vous écrire.

En fait, c'est surtout depuis que je lui réponds, il a un peu peur de devenir fou. Du coup, il écrit en pensant que ça ira mieux.

Passons. Je suis aussi ce qui se rapproche le plus d'un « admin sys » dans l'équipe. Maintenant, discutons des bugs de la semaine :

Le bug nº 72

Le titre est un peu facile, non ?

En ce moment, il y a deux gros bugs qui posent fortement problème pour sortir la version 0.2 et faire une jolie vidéo de présentation. Je ne m'en suis évidemment pas occupé tout de suite, préférant glander et jouer à Pokemon sur émulateur pendant quatre jours. Puis, entre deux activités ludiques extérieures — épandre et brasser du fumier —, j'ai enfin trouvé la solution au bug nº 72. Enfin, presque : ça fonctionne pour les maki verts 1 mais ça fait sauter le jeu pour les maki oranges et bleutés. Devant cette horreur, je m'arme de courage, de force, de mon debuggeur et d'un bon gros rhume trouvé entre deux pelletées de fumier, et je trouve l'origine du problème.

Bon, là, je vais essayer de vous expliquer le pourquoi du comment. Les gens que ça n'intéresse pas, je me demande pourquoi vous lisez ce billet mais comme je ne paie pas la consultation, faites comme chez vous…

Bref, les animations sont regroupées en listes. Une liste d'animation par action du joueur. Ces listes forment une pile : quand l'utilisateur demande un retour arrière on enlève la plus haute liste de la pile et on la lit pour déterminer les mouvements à effectuer pour revenir à la situation précédente.

Un petit schéma pour illustrer le paragraphe précédent…

C'est moche, d'accord, mais essayez de faire du graphisme sur un Commodore 64 tombé d'un porte-conteneurs malencontreusement échoué dans le port de Leningrad…

Le bug nº 72 s'explique par le fait qu'une assiette ne perd pas sa validation quand on fait un retour-arrière mais que le maki quitte tout de même l'assiette et joue l'animation « perte du bandeau ». La solution est donc au moment de la lecture de la liste pour le retour arrière, si l'animation à jouer est la perte du bandeau, de dire à l'assiette qui est à la même position que le maki qu'elle n'est plus validée.

Ça marche pour les maki verts mais les maki oranges et bleutés ont leur animation de perte de bandeau à la fin du mouvement, ce qui empêche la localisation de l'assiette : elle peut être n'importe où sur la ligne. Après avoir isolé le problème, je me lance évidemment dans la quête d'une solution. La première qui me vient est logiquement la plus compliquée : j'écris la plus longue et la plus tarabiscotée des fonctions pour tenter de vérifier que chaque assiette validée a bien un maki. Après deux heures de code et une heure de débogage, je me rends compte que pour jouer les animations dans le bon ordre — et donc retrouver la position de l'assiette facilement — il suffisait de retourner la liste…

J'ai donc mis trois heures pour écrire trois lignes de code. S'en suis un message de commit calme et posé (c'est archivé et public, il faut faire attention), puis un message de haine, d'horreur, de sang et de larmes dans notre salon IRC qui, évidemment, a choqué Lili.

Elle bluffe, la mijaurée !

Ned vole, oui, mais trop souvent

Le Superman russe.

Venons-en ensuite à l'épineux problème des maki oranges. Ces maki glissent car, comme chacun le sait, un maki orange c'est gras et, par conséquent, ça glisse et Ned s'y accroche et vole derrière le maki — mais bordel, qui a eu cette idée ?

Ned vole, oui, mais bon c'est ridicule de le faire voler quand le maki ne se déplace que d'une case. Du coup qui est-ce qui s'y colle ?

Le prolétaire !

Bon, alors on une jolie exception à gérer. Comme je ne peux pas savoir à l'avance de combien de cases va se déplacer le maki, on va travailler a posteriori : un mouvement d'une case pour un maki orange se caractérise par trois mouvements — début du vol, déplacement d'une case, arrêt du vol. Donc quand on a tout ça, eh bien c'est simple.

Enfin, vite dit…

Oui. En effet, il faut écrire le test pour savoir si c'est le bon mouvement, retirer les mouvements incriminés et rajouter les bons. Ouais, en fait, c'est simple.

Ned vole, oui, mais pas assez vite

Bon, j'ai intégré les animations il y a quelques temps mais le problème, c'est que Ned va trop vite. S'en suit un décalage assez étrange mais sympa… Je ne comprends pas pourquoi les autres n'en veulent pas.

Un koala masqué qui traverse un maki au saumon, ça a la hype, je trouve.

La vitesse de déplacement peut s'exprimer en secondes par case (s∙c–1 et oui, je crée des unités si je le veux). La vitesse actuelle globale du jeu est de 0,6 s∙c–1, tous les mouvements classiques vont à cette vitesse. Pour donner un effet d'accélération aux maki oranges et bleutés, j'ai décidé que quand on a parcouru plus d'une case, la vitesse est divisée par trois, donc de 0,2 s∙c–1. Bon, c'est joli mais il y a un décalage dans la réalité donc il va falloir se plonger un peu dans le code.

Et là, je découvre horrifié que, dans un de mes moments d'errement, j'ai soustrait 0,05 seconde au temps de déplacement de Ned, mais pas à celui du maki, ce qui explique pourquoi Ned va plus vite et passe au travers du maki. On enlève cette soustraction, on compile, on lance le jeu et là, horreur et damnation, Ned n'est plus en avance sur le maki, mais en retard !

Voyons voir ce qui se passe là-dedans. Ned attend 0 seconde, le maki attend 0 seconde ; Ned lance une animation, le maki ne lance pas d'animation ; Ned avance d'une case, le maki avance d'une case, et on boucle tant que le maki n'a pas été bloqué. Alors, d'où peut venir ce décalage ?

L'animation, patate !

Effectivement, après quelques tests il se trouve que si l'on fait jouer une animation au maki, il n'y a plus de retard. Si ce n'est pas parfait ça ?

Ton paragraphe au début, il n'a aucun rapport avec la résolution du bug ! En plus, t'as mis une fonction mathématique imbuvable à la place de ton truc tout simple pour calculer le temps de déplacement…

En effet, mais puisque vous êtes mon canard en plastique, je vous raconte tout. Même quand je me trompe de voie dans la résolution.

Comment ça vous ne pouviez pas cloner le dépot de manière publique ?

Bon, là c'est un problème d'administration. Quand on tentait de cloner le dépôt du code source de la forge, git nous crachait un joli :

fatal: The remote end hung up unexpectedly MiB | 2.17 MiB/s   
fatal: early EOF
fatal: recursion detected in die handler

Le peuple ne comprend pas…

Pour simplifier, Léni, le truc est qu'on n'a pas tout reçu. Du coup, git nous dit qu'il ne peut rien faire ave ce qu'il a reçu. Là, mon âme d'admin sys…

Le mot est fort.

Bon, d'accord, mon âme d'auto-hebergé se réveille. Vite, allons lire des logs passionnément.

D'un point de vue étymologique ça se rapproche de souffrance… il ne choisit pas ses mots au hasard.

Léni, tais-toi. Merci. Après cinq minutes de lecture, je constate que le processus qui envoie le code a été tué car il a duré trop longtemps. Une recherche web plus tard, j'édite le fichier de configuration et je relance le serveur : tout va pour le mieux dans le meilleur des mondes possible…

Choses à lire, à voir, à coder…

Voici une petite liste des choses que je vous recommande de lire en attendant mon prochain billet :


  1. Les maki verts et oranges sont censés être, respectivement, à l'avocat et au saumon. Ensuite, je ne sais pas si la matrice sait quel goût ont les aliments. Pour les maki bleutés, Ned J. n'a pas osé imaginer des maki au roquefort. 

  2. Compte tenu de la taille et du contenu de cette liste, je crois que Natir ne prévoit pas de vous revoir avant l'an prochain. (Les notes sont d'al.jes) 

Par Natir, le 20.03.2014. Haut de page.

Table des matières

Haut de page.

©GGP, certains droits réservés