Alt-F4 n°53 - La paresse et l’automatisation 26-11-2021
En exclusivité pour la parution n°53 de Alt-F4, le grand-maître Therenas lui-même revient nous honorer avec un nouvel article. Suite à ces précédents chefs-d’œuvre qui parlent principalement de ses propres mods, voici quelques élucubrations à ce sujet. Ces mots explorent le sujet de la prise automatique de captures d’écran dans Factorio. Mais il ne s’agit que de 20% de détails techniques, avec 40% de philosophie et 50% de mauvaises blagues. Vous avez bien lu, ça fait 110% !
La paresse et l’automatisation Therenas
J’ai souvent du mal à faire des captures d’écran appropriées pour mes mods. C’est beaucoup de travail de mettre en place un scénario de manière à ce qu’il soit attrayant et qu’il explique de manière visuelle un concept essentiel du mod. À mon avis, beaucoup de mods n’ont pas de bonnes captures d’écran, et ce n’est pas parce que leur auteur ne s’en soucie pas, mais parce qu’il est très difficile d’en créer de bonnes. Ils doivent faire beaucoup de travail avec un “langage” assez limité, même si une image vaut plus qu’un long discours.
Maintenant, même si tout cela fait penser à des jérémiades (ce qui est le cas), le problème réel n’est pas de prendre les captures d’écran elles-mêmes. C’est agréable de passer quelques heures dessus après avoir passé des dizaines ou des centaines d’heures sur le mod lui-même. Le problème réel est de les maintenir à jour. Chaque modification apportée au mod devrait idéalement être reflétée par des mises à jour des captures d’écran. Le fait qu’elles soient obsolètes est pour moi le signe d’un certain manque d’attention. Mais je suis peut-être trop pointilleux.
La fréquence à laquelle elles doivent être mises à jour dépend bien sûr de chaque mod. Si vous êtes le mod Bottleneck et que vous ne changez pas très souvent, vos captures d’écran ne seront pas périmées. Cependant, si vous êtes un mod avec une interface graphique raisonnablement complexe, pratiquement chaque nouvelle version modifie votre interface d’un pixel ici ou là. Idéalement, un correctif d’interface de cinq minutes devrait être accompagné par une mise à jour des captures d’écran, mais cela vous ferait passer beaucoup plus de temps à prendre des captures d’écran qu’à faire le travail lui-même. Personne ne veut faire cela, et les captures d’écran deviennent donc obsolètes au fil du temps.
La psychologie humaine aggrave cet effet et crée une sorte de cercle vicieux. Si vous savez que vos captures d’écran devront être mises à jour toutes les deux versions, vous déciderez de ne pas les mettre à jour, mais pour cette fois seulement. La prochaine version apportera de toute façon un autre changement, alors pourquoi s’embêter à les mettre à jour maintenant, ce serait une perte de temps. Mais lorsque la version suivante arrive, la même psychologie vous pousse à procrastiner une fois de plus. Juste cette fois-ci. Répétez cela à l’infini.
Peut-être que je suis juste incroyablement paresseux et que les gens normaux n’ont aucun problème avec ça. Ils mettront probablement à jour leurs captures d’écran à intervalles réguliers, ce qui leur permettra d’être à jour la plupart du temps. Mais pas moi. En pratique, cela me conduisait à mettre à jour les captures d’écran environ une fois tous les six mois, voire plus. Et pourtant cela me dérangeait qu’elles ne soient pas à jour. Mais la tendance à me dire “Je le ferai la prochaine fois” était trop forte pour un travail qui ne servirait plus à rien une semaine plus tard.
Pourtant, il me fallait une solution. J’avais besoin d’une solution, ne serait-ce que pour me décharger de la culpabilité que je m’étais infligée d’avoir des captures d’écran périmées. Cela ne devait pas être difficile à faire, bien sûr. L’idée de travailler sur moi-même en tant que personne ne me convenait pas, je le ferai la semaine prochaine. Il me semblait que l’automatisation était la terre promise, comme c’est souvent le cas.
J’ai déjà automatisé quelques processus liés au développement de mods, notamment le processus de conditionnement d’une nouvelle version et toute la micro-gestion qui en découle. Dans ce cas particulier, ce n’est même pas vraiment parce que je ne voulais pas faire les mêmes étapes fastidieuses pour toutes mes versions (169 à ce jour pour Factory Planner), il s’agit plutôt de m’empêcher de faire des erreurs pendant ce processus, ce qui pourrait conduire à des versions cassées pour les utilisateurs et ainsi de suite, ce qui ne serait pas une bonne chose.
Passons à la capture d’écran !
Bon, d’accord, passons à la partie amusante. Mon idée était assez simple : écrire un script Python qui lance Factorio avec un scénario personnalisé, qui prend ensuite en charge la partie capture d’écran (pour laquelle Factorio a un appel API dédié, heureusement), après quoi le script place les captures d’écran dans le bon dossier et les recadre peut-être un peu. La première partie est plutôt facile, il m’a suffi de trouver les arguments de ligne de commande dont j’avais besoin, de les enchaîner, et le scénario était prêt à fonctionner. Jusqu’ici, c’est simple.
Le scénario réel est cependant un peu plus compliqué. Pour pouvoir prendre des captures d’écran significatives, je dois configurer diverses interfaces graphiques dans différents états pour montrer la fonctionnalité que je veux mettre en évidence. Il est plus facile de faire ce genre de choses pour les entités sur la carte, car vous pouvez utiliser toutes les API que vous utiliseriez normalement pour interagir avec le jeu. Par contre, pour les interfaces graphiques, qui sont un peu un monde à part, vous devrez trouver votre propre système.
Le plus gros problème vient du fait qu’il n’est pas possible de simuler un utilisateur réel qui clique sur votre interface. Le jeu n’a pas de méthode API pour cela, puisque ce n’est pas nécessaire pour les mods eux-mêmes. Ce que cela signifie, c’est que vous devez d’une manière ou d’une autre émuler les clics. C’est un peu délicat car, à moins que votre mod ne soit configuré pour cela dès le départ, ou qu’il soit vraiment très bien structuré, vous devrez soit réécrire votre gestionnaire d’événements, soit utiliser des méthodes plutôt compliquées. Vous pouvez deviner quel chemin j’ai pris.
Après avoir mis de l’ordre dans les petits bidouillages, l’ensemble du dispositif est allé jusqu’à lancer le jeu, mettre en place l’interface dans un scénario intéressant, et prendre des captures d’écran de diverses parties de l’interface utilisateur. Je dois préciser que tout ceci est un peu du bricolage et se cassera probablement très facilement au fur et à mesure que le code du mod changera. Mais dans ce cas précis, il n’y a pas vraiment d’alternative, alors je vais devoir m’y faire. De toute façon, c’est beaucoup plus amusant de construire un tas géant de code spaghetti que de faire manuellement les mêmes captures d’écran encore et encore. Donc c’est une victoire dans les deux cas.
J’étais assez content de ce que j’avais fait jusqu’à présent, mais quand même, ce n’était pas de l’automatisation maximale. Voyez-vous, il restait à redimensionner les captures d’écran à une taille plus petite. De nombreuses boîtes de dialogue dans Factory Planner sont relativement petites, et la présence de l’univers du jeu en arrière-plan serait perturbante. J’aurais pu faire le recadrage manuellement, mais je n’en avais pas envie. Paresse. J’avais une idée de solution dans un coin de ma tête, mais elle nécessitait un peu de boulot salissant.
L’idée de base était d’enregistrer également la taille des boîtes de dialogue concernées par les captures d’écran pendant que le scénario les prenait en photo. Ces métadonnées pourraient alors aussi être écrites dans un fichier, et le script Python pourrait les utiliser pour découper les captures d’écran à la bonne taille. C’est une excellente idée en théorie, mais elle se heurte à un petit problème dans la réalité : le jeu ne permet pas de lire les dimensions des fenêtres de l’interface graphique, mais seulement de les définir.
C’est interdit pour une bonne raison, ces dimensions ne sont pas déterministes dans tous les cas, une langue de jeu différente pouvant par exemple modifier la taille de certains éléments. La lecture et l’utilisation de ces valeurs indéterminées en multijoueur entraînerait des désynchronisations, rendant le mod incompatible pour les parties en multijoueur, et briserait également les rediffusions. J’avais l’impression d’être dans une impasse. Étais-je condamné à toujours recadrer manuellement les captures d’écran ? Il s’avère que non.
Bon, je n’ai pas pu résoudre le problème de la lecture des dimensions des images qui entraîne des désynchronisations, c’est ainsi que le jeu fonctionne à un niveau fondamental. Toutefois, pour faire ces captures d’écran, je ne lance pas le jeu en multijoueur et il s’avère que vous pouvez déjà lancer le jeu dans un mode spécial appelé Instrument Mode qui désactive le multijoueur et active certaines fonctionnalités dangereuses. C’est l’endroit idéal pour glisser une méthode cachée super secrète qui me donne accès à la connaissance interdite des dimensions des images. J’ai donc pris les devants et l’ai insérée. Travailler pour Wube a ses avantages, on dirait bien.
Après plusieurs jours à accumuler les corrections, la bête a finalement pris vie, automatisant entièrement le processus de capture d’écran. Toutefois, l’automatisation complète du processus n’est pas totalement une réalité. Il s’avère en effet que ce n’est toujours pas entièrement automatisé. Bien sûr que ça ne l’est pas. Pourquoi devrais-je être entièrement satisfait, il y a deux étapes que je dois encore faire moi-même.
La première consiste à quitter le jeu après la prise des captures d’écran, afin que le script Python puisse continuer. Il s’avère qu’un mod ne peut pas demander à Factorio de se fermer. C’est tout à fait compréhensible, pour éviter les abus, même si ce serait une option intéressante à avoir pour l’Instrument Mode. Quoi qu’il en soit, je pense que je peux réussir à appuyer sur Alt-F4 (bing) au bon moment. J’ai même eu une pensée incongrue, celle de trouver un moyen de faire planter le jeu pour atteindre mon objectif. Je vous ai prévenu que tout ceci n’est qu’un tas de bricolages. Le problème avec ce plan est qu’il y a très peu de ce type de bugs dans le jeu, et une fois découverts, vous pouvez être sûr que le chasseur de bugs les écrasera immédiatement.
La seconde étape consiste à télécharger ces nouvelles captures d’écran toutes chaudes et fumantes sur le Portail des mods. Pour l’instant, il n’existe pas d’API permettant de manipuler les données du Portail des mods, donc je n’ai pas de chance de ce côté-là. Pour l’instant, je vais devoir ouvrir manuellement un navigateur, supprimer mes captures d’écran une par une, et télécharger les nouvelles images une par une. How tragic! Peut-être y a-t-il de l’espoir pour une API comme celle-ci à l’avenir, nous verrons.
En dehors de ces deux choses, je suis assez content de ce que ça a donné. Je pense que le jus valait la peine d’être pressé, car je vais pouvoir récolter les bénéfices de ce script indéfiniment. Les joies de l’automatisation : des gains infinis. Au moins jusqu’à la première fois où il se casse, ce qui est probablement pour très bientôt. Oh non.
Contribuer
Comme toujours, nous attendons vos contributions pour les Alt-F4, que cela soit par la soumission d’un article ou en aidant pour les traductions. Si vous avez quelque chose d’intéressant en tête que vous souhaitez partager avec la communauté, vous êtes au bon endroit. Si vous n’êtes pas sûr, nous serons heureux de vous aider en discutant structure, contenu et idées. Donc si vous voulez vous impliquer dans les Alt-F4, rejoignez-le Discord pour ne rien rater !