DEV Community

Cover image for đŸ˜¶ Du bruit Ă  un monde jouable
Mathieu Ledru
Mathieu Ledru

Posted on

đŸ˜¶ Du bruit Ă  un monde jouable

Darkwaar20 commence par du bruit.

Un plateau de 7×9 ne contient au dĂ©part ni terrain, ni chemin, ni objectif, ni structure visuelle significative. Chacune de ses 63 cases contient quatre canaux d’entiers gĂ©nĂ©rĂ©s Ă  partir d’une graine. Cinq transformations plus tard, ces mĂȘmes entiers dĂ©crivent un monde composĂ© de sol, de vide, d’énergie, d’un noyau et d’une sortie.

La transformation n’est pas automatique. Avant chaque passage, le joueur choisit comment le bruit doit se stabiliser. La gĂ©nĂ©ration constitue la premiĂšre phase du jeu. Explorer le rĂ©sultat en est la deuxiĂšme.

graine
↓
bruit
↓
cinq transformations contraintes
↓
terrain
↓
monde jouable
Enter fullscreen mode Exit fullscreen mode

Une mĂȘme graine n’implique pas un monde identique.

mĂȘme graine
+
contraintes différentes
=
monde différent
Enter fullscreen mode Exit fullscreen mode

Cette distinction constitue l’essence mĂȘme de l’expĂ©rience. Le bruit est fixe. Le joueur fournit les contraintes. Le plateau enregistre ce qui en rĂ©sulte.

Commencer par le bruit

Le plateau comporte sept colonnes et neuf lignes. Soixante-trois cellules. Quatre canaux par cellule. Les canaux sont des entiers ordinaires, gĂ©nĂ©rĂ©s Ă  partir d’une graine explicite ; le champ de dĂ©part est donc une variation qui peut ĂȘtre restituĂ©e Ă  l’identique.

Le hasard est utile car il empĂȘche chaque partie de ressembler Ă  la prĂ©cĂ©dente. Une graine est utile car elle rend cette variation reproductible. Deux parties peuvent partir du mĂȘme bruit et ne diverger que lorsque le joueur choisit une condition diffĂ©rente. Sans cette divergence, un plateau « mort » et un plateau « jouable » seraient des accidents indiscernables. GrĂące Ă  elle, la diffĂ©rence peut ĂȘtre attribuĂ©e.

entrée aléatoire
Enter fullscreen mode Exit fullscreen mode

est la graine.

influence du joueur
Enter fullscreen mode Exit fullscreen mode

correspond à la séquence de conditions.

À l’étape zĂ©ro, les canaux sont encore bruts. Les cellules voisines ne s’accordent pas. Rien sur le plateau n’est encore « terre » ou « vide », car ces termes constituent une interprĂ©tation qui n’existe pas avant que le cinquiĂšme passage ne soit verrouillĂ©. Ce que le joueur voit, c’est le bruit lui-mĂȘme : quatre valeurs, reprĂ©sentĂ©es sous la forme d’un champ indĂ©cis.

Dans Darkwaar20, le « dĂ©bruisage » est un terme de conception de jeu dĂ©signant les passages qui suivent. La mise en Ɠuvre repose sur l’arithmĂ©tique entiĂšre dĂ©terministe. Il n’y a ni rĂ©seau neuronal, ni modĂšle entraĂźnĂ©, ni infĂ©rence de gĂ©nĂ©ration d’images. Le schĂ©ma utile est plus simple :

bruit
→ transformations locales rĂ©pĂ©tĂ©es
→ structure de plus en plus stable
Enter fullscreen mode Exit fullscreen mode

Cinq façons de façonner la mĂȘme graine

Chaque passe ne prend en compte que le plateau actuel. Une cellule ne conserve pas d’historique expliquant pourquoi sa valeur existe. Elle contient quatre entiers. La passe lit ces entiers, lit les voisins orthogonaux, applique la condition sĂ©lectionnĂ©e et Ă©crit le plateau suivant. Ce plateau suivant est la seule entrĂ©e dont le passage suivant a besoin.

état n
+
rĂšgle locale
=
état n + 1
Enter fullscreen mode Exit fullscreen mode

La rĂšgle de base est la mĂȘme pour chaque condition. Calculer la moyenne de la cellule avec ses voisins orthogonaux existants, puis ajuster chaque canal Ă  l’un des quatre niveaux suivants :

value = average(cell, north, south, east, west)
value = snap(value, [0, 85, 170, 255])
Enter fullscreen mode Exit fullscreen mode

L'alignement est l’étape qui crĂ©e la structure. Un canal qui pourrait se situer n’importe oĂč entre 0 et 255 est contraint de s’aligner sur un Ă©chelon. Des cellules qui Ă©taient simplement proches deviennent identiques. Les voisins identiques survivent plus facilement au calcul de moyenne suivant qu’un champ dispersĂ©. RĂ©pĂ©tez l’itĂ©ration et les divergences locales s’amenuisent. Des rĂ©gions apparaissent parce que la prĂ©cision a Ă©tĂ© supprimĂ©e, et non parce qu’une forme a Ă©tĂ© dessinĂ©e.

La condition sĂ©lectionnĂ©e modifie cette moyenne avant l’alignement. LIFE, ORDER et VOID ne sont pas des Ă©tiquettes superposĂ©es Ă  un seul algorithme. Ce sont trois modifications distinctes.

LIFE augmente la moyenne, et augmente davantage la valeur d’une cellule soutenue. Par « soutenue », on entend une voisine orthogonale dont la valeur sur ce canal se situe Ă  moins de 64 de celle de la cellule. Deux voisines de ce type ou plus ajoutent 48. Moins de deux ajoutent 16. Le rĂ©sultat est plafonnĂ© puis alignĂ©. Les structures connectĂ©es et similaires sont poussĂ©es vers le haut. Une cellule isolĂ©e Ă©volue tout de mĂȘme, mais dans une moindre mesure, ce qui permet Ă  un passage ultĂ©rieur de la laisser plus facilement derriĂšre lui.

ORDER modifie la moyenne elle-mĂȘme. Chaque voisin est comptĂ© trois fois, et la cellule une fois. Le passage recense Ă©galement quel niveau alignĂ© apparaĂźt parmi la cellule et ses voisins. Si un niveau recueille une majoritĂ© stricte, ce niveau l’emporte sans appel. Sinon, la moyenne pondĂ©rĂ©e est ajustĂ©e comme d’habitude. Les divergences au sein d’un voisinage sont Ă©cartĂ©es dĂšs qu’un niveau parvient Ă  l’emporter sur les autres. Les rĂ©gions cohĂ©rentes se dĂ©veloppent plus rapidement sous ORDER que sous une simple moyenne, car c’est le voisinage qui est autorisĂ© Ă  dĂ©cider.

VOID abaisse la moyenne. Moins de deux voisins favorables soustraient 120. Deux voisins ou plus soustraient 64. Le rĂ©sultat est plafonnĂ© Ă  zĂ©ro et arrondi. Les structures faibles ou isolĂ©es sont repoussĂ©es vers le bas de l’échelle. Des passages rĂ©pĂ©tĂ©s de VOID ne creusent pas un trou prĂ©dĂ©fini. Ils font s’effondrer tout ce qui n’était pas dĂ©jĂ  soutenu par ses voisins, jusqu’à ce que des valeurs faibles recouvrent la cellule et, par la suite, soient interprĂ©tĂ©es comme vides.

Aucune de ces rĂšgles ne simule un processus physique. Il s’agit de modifications locales d’entiers dont les consĂ©quences sont lisibles : LIFE renforce les structures soutenues, ORDER rĂ©sout les dĂ©saccords, VOID efface ce qui n’est pas soutenu.

Cinq passages correspondent à cinq décisions, et non à cinq itérations automatiques.

condition
→ rĂ©gler
→ inspecter
Enter fullscreen mode Exit fullscreen mode

AprĂšs chaque « settle », le plateau est visible. Les premiers passages semblent encore bruyants, mais des zones plates commencent Ă  apparaĂźtre. Les passages suivants rĂ©vĂšlent des rĂ©gions plus vastes. Le joueur ne regarde pas une barre de progression. Il lit un rĂ©sultat partiel et choisit la contrainte suivante en tenant compte de ce rĂ©sultat. Le monde n’est pas gĂ©nĂ©rĂ© avant le dĂ©but de la partie. La gĂ©nĂ©ration du monde constitue la premiĂšre phase du jeu.

Un sixiĂšme passage ne fait rien. Une fois que cinq conditions ont Ă©tĂ© appliquĂ©es, les canaux cessent d’ĂȘtre du bruit et deviennent du terrain.

Transformer des nombres en terrain

Le gĂ©nĂ©rateur ne construit pas une deuxiĂšme carte. Il lit les quatre mĂȘmes canaux qu’il a réécrits.

sum = a + b + c + d
Enter fullscreen mode Exit fullscreen mode
sum <= 340  →  VIDE
sum >= 680  →  ÉNERGIE
sinon   →  SOL
Enter fullscreen mode Exit fullscreen mode

Les seuils correspondent aux niveaux d’alignement. Quatre canaux Ă  85 donnent un total de 340, ce qui correspond au vide. Quatre canaux Ă  170 donnent un total de 680, ce qui correspond Ă  l’énergie. Toute valeur intermĂ©diaire correspond au sol. La continuitĂ© est importante :

valeurs de bruit
→ valeurs stabilisĂ©es
→ terrain
Enter fullscreen mode Exit fullscreen mode

Aucun jet de dĂ© distinct ne place de murs, d’énergie ou de piĂšces. Le terrain correspond Ă  une lecture du champ laissĂ© par le passage.

Ce champ doit encore devenir un itinĂ©raire. Le noyau est la cellule non « vide » la plus forte. Son score est a + b + 2c : les deux premiers canaux comptent une fois, le troisiĂšme canal compte deux fois. Le score le plus Ă©levĂ© l’emporte. En cas d’égalitĂ©, on privilĂ©gie la plus petite ligne, puis la plus petite colonne. La sortie est choisie uniquement parmi les cellules de sol accessibles depuis le noyau par un parcours orthogonal Ă  travers le sol et l’énergie. Parmi ces cellules, celle qui est la plus Ă©loignĂ©e du noyau selon la distance de Manhattan l’emporte. En cas d’égalitĂ©, on privilĂ©gie la plus grande ligne, puis la plus grande colonne. L’énergie peut ĂȘtre traversĂ©e. Elle ne peut pas constituer la sortie. Le noyau lui-mĂȘme n’est pas Ă©ligible.

Rien n’est placĂ© a posteriori. Si les passages ne laissent aucune case non vide, il n’y a pas de noyau. Si aucune case « sol » n’est accessible, il n’y a pas de sortie. La topologie correspond Ă  l’itinĂ©raire.

Quand la génération devient gameplay

AprĂšs le cinquiĂšme passage, les rĂšgles se simplifient. Le joueur se trouve sur le noyau. Le dĂ©placement se fait d’un pas orthogonal. On peut entrer dans les cases « sol », « Ă©nergie » et « sortie ». Le vide bloque le passage. Atteindre la sortie permet de gagner. Un plateau sans sortie accessible n’est ni rĂ©parĂ© ni relancĂ©. Il se termine par « NO WAY OUT ».

La traversĂ©e est simple car les dĂ©cisions ont dĂ©jĂ  Ă©tĂ© prises. Marcher rĂ©pond Ă  une seule question : ces cinq transformations ont-elles laissĂ© un monde viable ? Un long chemin n’est pas une deuxiĂšme Ă©nigme superposĂ©e Ă  la gĂ©nĂ©ration. C’est la consĂ©quence du champ produit par la gĂ©nĂ©ration.

L’image retrace le mĂȘme processus. L’image d’ouverture est du bruit brut. Les images intermĂ©diaires mĂ©langent ce bruit aux rĂ©gions que les seuils impliqueraient dĂ©jĂ . Les images suivantes se fixent sur des zones plus vastes de sol, d’énergie et de vide. La derniĂšre image reprĂ©sente le monde figĂ©, avec le noyau et la sortie marquĂ©s. Le dessin n’est pas une illustration distincte. C’est l’état lui-mĂȘme, reprĂ©sentĂ© avec moins de dĂ©tails entiers Ă  mesure que cet Ă©tat devient plus contraint. Le joueur peut suivre la perte de possibilitĂ©s sans lire les canaux.

MĂȘme bruit, monde diffĂ©rent

La graine 20020 est l’exemple examinĂ©. Le champ d’ouverture est identique dans les deux exĂ©cutions. Seules les cinq conditions changent.

LIFE
ORDER
LIFE
VOID
ORDER
Enter fullscreen mode Exit fullscreen mode

verrouille un monde jouable. Le noyau est (3, 0). La sortie est (6, 8). Le plateau contient 6 cases vides, 54 cases de sol et 3 cases d’énergie. Une marche orthogonale depuis le noyau permet d’atteindre la sortie.

La graine est ensuite restaurĂ©e, ce qui rĂ©tablit le bruit d’origine, le nombre de pas et l’historique vide. La deuxiĂšme sĂ©quence est :

VOID
VOID
ORDER
VOID
LIFE
Enter fullscreen mode Exit fullscreen mode

Chacune des 63 cellules est vide. Il n’y a ni noyau, ni sortie, ni chemin. Le rĂ©sultat est NO WAY OUT.

graine 20020 + séquence A  =  monde jouable
graine 20020 + séquence B  =  monde mort
Enter fullscreen mode Exit fullscreen mode

Ce n’est pas le hasard initial qui en a dĂ©cidĂ© ainsi. Ce sont les contraintes.

Petites rÚgles, conséquences générées

À l’étape zĂ©ro, chaque cellule a encore de nombreux avenirs possibles. Un canal peut se diriger vers n’importe lequel des quatre Ă©chelons, et cinq choix restent possibles. Chaque passage Ă©limine certains de ces avenirs. LIFE consacre une Ă©tape Ă  maintenir les valeurs soutenues Ă  un niveau Ă©levĂ©. ORDER consacre une Ă©tape Ă  laisser une majoritĂ© locale effacer la minoritĂ©. VOID consacre une Ă©tape Ă  faire reculer les valeurs non soutenues. À l’étape cinq, l’incertitude s’est suffisamment dissipĂ©e pour que les sommes puissent ĂȘtre interprĂ©tĂ©es comme un terrain, et que ce terrain puisse ĂȘtre interprĂ©tĂ© comme un itinĂ©raire.

Il s’agit lĂ  d’une gĂ©nĂ©ration par contrainte, et non par placement. L’implĂ©mentation n’indique jamais oĂč se trouve un mur, oĂč va l’énergie, ni oĂč se trouve la sortie. Elle se contente de restreindre le champ. La sortie apparaĂźt lĂ  oĂč le terrain restant est le plus Ă©loignĂ© de la cellule restante la plus forte, parmi les cellules que le vide n’a pas isolĂ©es. Si les restrictions vont trop loin, la sortie n’apparaĂźt pas du tout.

de nombreux mondes possibles
↓
contrainte
↓
moins de mondes possibles
↓
contrainte
↓
topologie stable
↓
monde jouable
Enter fullscreen mode Exit fullscreen mode

Le mĂ©canisme reste simple car le plateau fait office de mĂ©moire. Il n’y a pas de passe-biome, pas de passe-piĂšce, pas de passe-chemin, pas de placeur de ressources, ni d’étape de rĂ©paration qui corrige discrĂštement une carte illĂ©gale. Quelques rĂšgles entiĂšres, un voisinage, une quantification, cinq dĂ©cisions, deux seuils et un choix dĂ©terministe du noyau et de la sortie suffisent pour qu’une topologie apparaisse. La complexitĂ© rĂ©sulte ici de la rĂ©pĂ©tition d’une rĂšgle locale, et non d’un catalogue de systĂšmes possĂ©dant chacun un type de contenu particulier.

L’échec fait partie de ce rĂ©sultat. De nombreux gĂ©nĂ©rateurs testent un niveau et relancent le processus jusqu’à ce qu’un chemin existe. Darkwaar20 conserve le plateau inerte. Si chaque sĂ©quence Ă©tait corrigĂ©e pour former une carte praticable, la VIE, l’ORDRE et le VIDE ne seraient que des prĂ©fĂ©rences visuelles. « NO WAY OUT » est la preuve qu’il n’en est rien. Un monde dont la validitĂ© serait garantie serait plus facile Ă  finaliser. Un Ă©chec autorisĂ© donne tout son sens aux cinq conditions. Darkwaar20 choisit la deuxiĂšme option.

Le compromis est visible sur une seule graine. La sĂ©quence A laisse un noyau en haut du plateau et une sortie dans le coin le plus Ă©loignĂ©, avec une faible dispersion de vide et d’énergie. La sĂ©quence B, Ă  partir des mĂȘmes nombres entiers, consacre quatre de ses cinq dĂ©cisions Ă  faire descendre des cellules non soutenues et aboutit Ă  un plateau impraticable. MĂȘme bruit. Des contraintes cumulĂ©es diffĂ©rentes. Un jeu diffĂ©rent, y compris un jeu auquel on ne peut pas jouer.

Jouer Ă  Darkwaar20

Le bruit n’est pas le monde gĂ©nĂ©rĂ©. C’est l’espace des mondes possibles. Cinq choix Ă©liminent des possibilitĂ©s jusqu’à ce qu’il ne reste qu’un seul monde. Darkwaar20 demande alors au joueur de parcourir les consĂ©quences.

La gĂ©nĂ©ration fait partie intĂ©grante du jeu, car le joueur impose des contraintes au monde avant mĂȘme de devoir y jouer.

Darkwaar20 est jouable dans le navigateur sur itch.io. La page de lancement de Darkwaar20 correspond Ă  la fiche du jeu sur darkwaar.com.

Top comments (0)