Alt-F4 n°55 - Les ruelles sombres du modding  17-12-2021

Écrit par stringweasel, MagmaMcFry, raiguard, Deadlock989, Anachrony, PFQNiet, Earendel, édité par Nanogamer7, Conor_, Therenas, MyNameIsTrez, Firerazer,
traduit par bev, Firerazer

Sommaire

Pour le numéro 55 d’Alt-F4, stringweasel a préparé une friandise très spéciale pour tout le monde, en demandant à différents moddeurs de parler des bidouillages les plus secrets et les plus sombres qu’ils ont inventés pour faire fonctionner leurs mods. MagmaMcFry, raiguard, Deadlock989, Anachrony, PFQNiet et Earendel, ils ont tous confessé leurs péchés !

Modding : les coulisses stringweasel

Il est bon de répéter que Factorio dispose d’une communauté de moddeurs absolument incroyable. Ceci dit, vous ne vous rendez peut-être pas compte des efforts que certains moddeurs doivent fournir pour créer leurs chefs-d’œuvre. Surtout lorsqu’ils commencent à se heurter aux limites du moteur. Les développeurs de Factorio essaient d’étendre le moteur pour donner plus de flexibilité aux moddeurs, mais il est impossible de permettre aux moddeurs de faire tout ce qu’ils veulent. Ainsi, lorsque les moddeurs atteignent une limite de ce que Factorio leur permet de faire, ils doivent faire preuve de créativité pour concrétiser leur vision. Ce qu’ils trouvent, ce sont généralement des bidouillages contournements intéressants et farfelus que le joueur ne remarque souvent même pas. Je trouve toujours ces contournements fascinants, c’est pourquoi j’ai contacté quelques moddeurs et leur ai demandé de me raconter leurs histoires préférées sur la façon dont ils ont plié Factorio à leur volonté.

Factorissimo : différencier les usines que vous avez ramassées MagmaMcFry

En 0.13, Factorio ne prenait pas en charge les métadonnées des objets aussi bien qu’aujourd’hui, de sorte que la seule façon de pouvoir stocker des données dans les objets (et de lire ces données en posant l’objet, comme une machine) était d’utiliser leur quantité de dégâts. Ainsi, avec Factorissimo 1, dès que vous récupérez un bâtiment d’usine, la quantité de dégâts de l’entité est instantanément remplacée par un nombre unique associé à l’intérieur du bâtiment. Lorsque vous reposez le bâtiment, la quantité de dégâts est analysée pour déterminer à quel intérieur il doit être relié, et enfin la quantité de dégâts de l’entité est réinitialisée à ce qu’elle était avant que vous ne la ramassiez.

Un exemple de bâtiments de Factorissimo 1 dans votre inventaire, en 0.14. Remarquez que tous ces bâtiments ont un très faible niveau de santé. Notez également l’ancien bâtiment de Factorissimo en arrière-plan.
Un exemple de bâtiments de Factorissimo 1 dans votre inventaire, en 0.14. Remarquez que tous ces bâtiments ont un très faible niveau de santé. Notez également l’ancien bâtiment de Factorissimo en arrière-plan.

Pendant que je travaillais sur Factorissimo 2, les développeurs de Factorio faisaient allusion à la possibilité de rendre les objets endommagés empilables (ce n’était pas le cas auparavant, et cela aurait cassé mon système), et la gestion des métadonnées des objets dans l’API n’était pas encore assez développée dans la version 0.14. Donc dans Factorissimo 2, le mécanisme utilisé est encore plus bricolé : au lieu de stocker les données d’un bâtiment dans la quantité de dégâts, elles sont stockées dans le type d’objet. Tout à fait. Lorsque vous ramassez un bâtiment d’usine, vous récupérez en fait un objet avec un nouveau type interne unique qui se trouve avoir le même nom et le même graphisme qu’un bâtiment d’usine normal. En raison d’un autre manque de fonctionnalités de l’API, le type d’une entité de bâtiment d’usine est également modifié dès que vous marquez un bâtiment d’usine pour la déconstruction, et pas uniquement lorsqu’un robot le déconstruit effectivement. Étant donné que vous ne pouvez pas générer de nouveaux types d’objets à la volée, il y a un nombre maximum de prototypes d’objets par taille d’usine (que j’ai arbitrairement fixé à 90), donc si vous êtes très inconstants dans la réutilisation des bâtiments d’usine, ou pire, si vous supprimez les anciens bâtiments sous forme d’objets (ce qui n’est pas traçable), vous pouvez rencontrer un message d’erreur disant “Impossible de ramasser plus de 90 bâtiments d’usine d’une même taille à la fois”. C’est également la raison pour laquelle le coffre de demande de bâtiments d’usine existe. En effet, comme les entités spéciales sont ignorées des filtres logistiques, vous n’avez aucun autre moyen pour demander vos bâtiments d’usine utilisés au système logistique.

Cette solution de contournement est clairement visible à droite en ouvrant l’éditeur de Factorio, où chacun de ces objets est affiché individuellement.
Cette solution de contournement est clairement visible à droite en ouvrant l’éditeur de Factorio, où chacun de ces objets est affiché individuellement.

Quelques autres mentions honorables de bidouillages actuels et précédents : détection des connexions de fluides aux bâtiments d’usine via des entités de tuyaux factices, transport de signaux logiques entre surfaces en remplissant des émetteurs de constantes, transport d’énergie entre surfaces en la transférant entre des accumulateurs (c’est pourquoi les connexions d’énergie sont à sens unique), entités annexes avec lesquelles vous pouvez interagir en les faisant littéralement tourner, placement de foreuses minières invisibles pour fournir des flèches indicatrices de connexion en mode Alt, coffres invisibles contenant des objets réels pour la superposition d’icônes d’objets, etc.

À l’heure actuelle, la plupart de ces bidouillages ne sont plus nécessaires, puisque l’API prend en charge correctement les fonctionnalités souhaitées (ou du moins propose des bidouillages plus propres). Certains d’entre eux ont été supprimés avec succès, d’autres sont profondément enracinés dans l’ancien code. Peut-être que je nettoierai tout cela et que j’écrirai Factorissimo 3 un jour.

Tapeline : la fonctionnalité de glissement raiguard

Un exemple de mètre ruban normal créée par un joueur.
Un exemple de mètre ruban normal créée par un joueur.

La version originale de Tapeline était assez simple : vous sélectionnez une zone avec un outil de sélection, et il dessine une règle de la taille de ce que vous venez de sélectionner sur le sol. Cependant, je voulais pouvoir commencer à dessiner le ruban dès que vous faites glisser votre souris. Il n’existe pas de moyen direct de le faire, j’ai donc dû faire preuve de créativité.

La première implémentation de ce système utilisait des grenades invisibles avec un temps de recharge de deux ticks. En maintenant votre souris enfoncée, vous lanciez continuellement ces grenades, et le mod captait cet événement pour mettre à jour la position. Le mod détectait la fin du déplacement lorsque vous cessiez de lancer ces grenades à intervalle de deux ticks.

Cependant, cela posait des problèmes. Tout d’abord, vous ne pouviez pas du tout l’utiliser en vue carte, ce qui limitait considérablement l’utilité du mod. Il y avait aussi des problèmes de latence en multijoueur, où le délai entre les lancers de la grenade n’était pas 100% cohérent comme en mode solo. Vous ne pouviez pas non plus du tout utiliser le mod lorsque le temps était arrêté, dans l’éditeur de carte. En fait, il s’agissait d’une mise en œuvre à moitié réalisée.

Après un long moment, j’ai eu une idée : et si j’utilisais un outil de sélection, mais que je plaçais des entités le long du chemin pour me dire où se trouve actuellement la souris ? Cela me permettrait de mettre à jour le ruban au fur et à mesure que vous faites glisser la souris, et de détecter quand vous avez fini de le faire en lisant l’événement normal de l’outil de sélection. Cela me permettrait également de savoir si vous maintenez la touche Maj pendant le déplacement.

Une visualisation des entités cachées qui sont placées en coulisse lorsque vous faites glisser un mètre ruban.
Une visualisation des entités cachées qui sont placées en coulisse lorsque vous faites glisser un mètre ruban.

J’ai fait un test en assignant simplement un lieu déterminé à un outil de sélection, et par miracle, ça a marché ! Le mod est maintenant 100% utilisable en multijoueur, et il fonctionne même en vue carte. Il y a encore quelques problèmes ici et là (par exemple, le glisser-déposer vous agresse les oreilles avec un bruit de placement de fantômes), mais l’utilisation d’un outil de sélection m’a permis d’éliminer complètement l’interface graphique du mod et de rendre son utilisation beaucoup plus intuitive. Je suis constamment impressionné par tout ce que l’on peut faire avec le moteur de Factorio, même lorsque le moteur n’a pas prévu que cela soit possible.

Industrial Revolution 2 : le Transmat Deadlock989

Je dois cacher les joueurs pendant la téléportation dans la séquence du Transmat, ce qui nécessite actuellement des ruses folles impliquant des voitures invisibles et indestructibles et l’obligation de les retrouver et de les nettoyer à nouveau en cas d’imprévus multiples. En effet les joueurs (et leur personnage attaché) peuvent être téléportés entre surfaces, tout comme les véhicules. Mais les personnages sans joueur attaché ne peuvent pas être téléportés entre surfaces, et pendant une cinématique, le joueur n’est pas attaché à son personnage. La séquence que je voulais créer nécessitait que le personnage soit invisible une partie du temps, mais pas tout le temps, et la façon la moins gênante d’y parvenir s’est avérée être de fabriquer une voiture invisible et sans collision, de le mettre à l’intérieur et de le téléporter temporairement sur une surface annexe pendant que le point de vue de la cinématique se déplace de site en site.

Il existe d’autres options astucieuses qui n’impliquent pas de véhicule personnalisé invisible, mais certaines d’entre elles ont des effets secondaires très désagréables (par exemple, la téléportation temporaire du personnage à un endroit très éloigné sur la même surface peut avoir un effet dévastateur sur les performances du jeu, causé par le système de recherche de trajectoire des ennemis, si le personnage téléporté est attaqué). Elles doivent également être robustes pour éviter que, en multijoueur, les gens se déconnectent pendant la séquence, ce qui rendait le clonage destructif trop compliqué (vous ne pouvez pas téléporter un personnage déconnecté sur une autre surface, mais vous pouvez cloner le personnage sur une autre surface puis détruire l’original, ce qui est philosophiquement intéressant, mais qui s’est avéré très ennuyeux à “nettoyer” si la séquence est interrompue par une déconnexion ou perturbée par un autre mod). Il y a probablement de meilleures façons de s’attaquer à ce problème, mais comme pour beaucoup de mods de Factorio, il s’agit de tâtonner dans le noir jusqu’à ce que vous trouviez quelque chose qui fonctionne.

Le joueur est téléporté grâce aux magnifiques Transmats d’Industrial Revolution 2.

Nullius : l’écart entre les éoliennes Anachrony

Les éoliennes de Nullius sont destinées à être espacées de 32 tuiles. Elles sont peu sophistiquées, bon marché et efficaces, mais leurs inconvénients sont que leur production varie de façon imprévisible et qu’elles nécessitent beaucoup de place en raison de l’espacement requis. Ce qui est important, c’est qu’elles n’empêchent pas la construction d’autres bâtiments à proximité, à l’exception d’autres éoliennes. Le moteur du jeu ne rend pas ce type de règle de placement différencié facile à mettre en œuvre. Dans une ancienne version du mod, lorsque l’éolienne était construite, un script ajoutait un grand carré invisible centré sur elle, qui empêchait la construction d’autres éoliennes à proximité, mais n’entrait en collision avec rien d’autre. Cependant, un défaut majeur de ce système était que ce carré d’espace invisible entrait également en collision avec l’emplacement de l’éolienne originale, empêchant son remplacement rapide ou sa mise à niveau par une éolienne de plus haute technologie. Contrairement à la mise à niveau d’autres structures, vous devez d’abord démolir l’éolienne d’origine avant de la reconstruire en une étape distincte, ce qui est gênant et déroutant. La solution a été de diviser le grand carré unique en quatre rectangles, deux horizontaux et deux verticaux, qui s’emboîtent pour créer un motif où les seuls endroits valables pour construire une nouvelle éolienne sont à 32 tuiles de distance OU directement sur l’ancienne éolienne, ce qui permet de la remplacer/améliorer rapidement. L’image suivante montre les rectangles de collision qui empêchent de placer une deuxième éolienne trop près.

Exemple de boîtes de collision invisibles de l’éolienne se heurtant au placement d’une autre éolienne.
Exemple de boîtes de collision invisibles de l’éolienne se heurtant au placement d’une autre éolienne.

Satisfactorio : vitesse du broyeur A.W.E.S.O.M.E. PFQNiet

De nombreux mods de révision ont une sorte de “machine à vide” pour supprimer automatiquement les éléments que vous ne voulez pas. Angel/Bob dispose de la torchère pour se débarrasser des gaz indésirables, Krastorio a le broyeur, et Industrial Revolution utilise un incinérateur pour se débarrasser des objets encombrants.

Satisfactory possède le broyeur A.W.E.S.O.M.E., que j’ai dû recréer dans mon mod Satisfactorio. Le broyeur prend (presque) n’importe quel objet en entrée, et produit des points pour gagner des coupons, qui peuvent ensuite être dépensés dans la boutique A.W.E.S.O.M.E. Il consomme des objets aussi vite que vous pouvez le nourrir, et consomme 30MW d’énergie.

Toutes les “machines à vide” suivent le même principe dans Factorio : créer une entité four et une “recette” pour chaque objet existant qui consomme l’objet et ne produit rien. Le moteur du jeu s’occupe du reste. Dans mon cas, j’avais réglé la recette pour qu’elle soit suffisamment rapide pour consommer des objets d’un convoyeur MK5 (le plus rapide du mod). Cependant, si un convoyeur plus lent était utilisé, la machine passait la plupart de son temps à l’arrêt, ce qui rendait sa consommation d’énergie bien inférieure à ce qu’elle aurait dû être.

Image de la courbe de consommation d’énergie en forme de pointe

Il m’a fallu un certain temps pour trouver une solution, mais j’ai finalement décidé de rendre la recette juste assez rapide pour un convoyeur MK1 (le plus lent !) et d’utiliser un diffuseur invisible. Ce diffuseur spécial a une efficacité de 100% (les diffuseurs standards ne transmettent que 50% de leur effet) et accepte un type spécial de module qui fournit +100% de vitesse sans coût. Ensuite, le script vérifie la vitesse du convoyeur connecté à la machine, et si nécessaire ajoute ou retire des modules au diffuseur caché. Les convoyeurs MK2 transportent deux fois plus que les MK1, donc il reçoit un seul module pour +100% de vitesse. Ceci s’applique à chaque convoyeur. Les convoyeurs MK5 transportent sept fois plus d’objets, donc six modules sont ajoutés au diffuseur.

Image du diffuseur invisible avec 2 modules

Cette configuration signifie que, quel que soit le niveau de convoyeur que vous introduisez dans le broyeur A.W.E.S.O.M.E., il ajustera sa vitesse pour consommer les objets à ce rythme précis, ce qui se traduit par un graphique de consommation parfaitement lisse, sans pics, et sans mauvaises surprises en cas de coupure de courant !

Image de la courbe de consommation d’énergie corrigée

AAI Programmable Vehicles : un déchiqueteur au volant Earendel

J’avais besoin que mes véhicules aillent de A à B, mais ils ne pouvaient pas toujours y aller en ligne droite. Ils devaient trouver un chemin autour des obstacles. L’écriture d’un algorithme de recherche de trajectoire n’est pas si difficile, mais ici, le problème pour un système de recherche de trajectoire est d’avoir une représentation précise de la carte. Interroger l’état de la carte d’une manière qui soit utile serait d’une lenteur irréaliste, et l’accès au système de recherche de trajectoire en C++ de Factorio n’était pas disponible (à ce moment-là), donc j’avais besoin de quelque chose d’un peu plus… créatif. Le jeu dispose d’un type d’”unité” intégré qui est utilisé pour les déchiqueteurs, et on peut leur demander d’aller à une destination en utilisant le système de recherche de trajectoire intégré. Le problème est que les unités ne sont pas des véhicules : elles ne peuvent pas contenir de passagers, elles n’ont pas d’inventaire et elles ne peuvent pas utiliser de munitions.

Le véhicule de surveillance d’Earendel se déplace automatiquement près d’une falaise.

Ma solution un peu folle consiste à placer une unité invisible devant le véhicule, que j’appelle “le navigateur”, qui a la même taille et les mêmes paramètres de collision que le véhicule. Je lui demande d’aller à un endroit, je suis le mouvement et j’utilise sa trajectoire pour celle du véhicule. Ainsi, on pourrait dire que le véhicule est conduit par un déchiqueteur invisible. Cela fonctionnait plutôt bien, mais avait beaucoup d’effets secondaires bizarres. Par exemple, il arrivait que le navigateur prenne feu, de sorte qu’en tant que joueur qui n’est pas conscient de l’existence du navigateur, vous voyiez soudainement du feu détaché se déplacer sur la carte sans raison apparente. Parfois, le navigateur ne trouvait pas de trajectoire ou était distrait et commençait à tourner en rond, mais comme il n’était pas possible de dire s’il s’agissait d’une trajectoire correcte ou si le navigateur était simplement défaillant, le véhicule devait simplement le suivre pendant un moment jusqu’à ce qu’il détecte qu’il avait tourné en rond.

Finalement, Wube a répondu à ma demande de mettre le système de recherche de trajectoire en C++ à la disposition des moddeurs, et toute cette histoire de “déchiqueteur pilote” appartient au passé, mais pour moi, c’est le bidouillage de mod le plus farfelu et le plus drôle.

Partagez vos anecdotes !

Ce que vous lisez ci-dessus n’est qu’une poignée des témoignages que j’ai entendus, et nous publierons un autre article avec des histoires de modding encore plus effrayantes de la part d’autres moddeurs dans le futur. Si vous êtes un moddeur et que vous avez une histoire intéressante de bidouillages contournements, ou tout ce qui a trait à Factorio, faites-le nous savoir ! Nous aimerions en parler au monde entier. Il est important de parler d’événements aussi traumatisants, car il n’est jamais bon de tout garder pour soi. Cela pourrait ralentir la croissance de votre usine, après tout. On ne voudrait pas ça.

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 !