Comment les donjons sont générés dans Enter The Gungeon

Récemment, j'ai beaucoup joué dans Enter The Gungeon . Ceci est un jeu d'enfer de balle génial et terriblement difficile qui me rappelle beaucoup de Binding of Isaac . Mais plus je le jouais, plus je réalisais le génie subtil du design du donjon.


Il existe de nombreux générateurs procéduraux qui créent des schémas de niveaux logiques qui garantissent le bon rythme du jeu et récompensent les joueurs, et il existe d'autres générateurs qui créent des niveaux avec des boucles et des schémas compacts. Mais il est rare de trouver les deux types dans un jeu. Le seul jeu que je connaisse dans lequel il y ait eu une tentative d'implémentation d'une telle chose est inexploré .

J'ai donc naturellement lancé le décompilateur pour que Gungeon me révèle tous ses secrets. Dans cet article, je partagerai avec vous ce que j'ai réussi à trouver.



À première vue, les niveaux de Gungeon semblent assez simples. Voici un exemple de carte typique.


Carte de niveau 1 typique

Le joueur commence à l'entrée. traverse les coffres et commerçant pour collecter du butin et finalement vainc le patron . Si vous tombez dans une longue impasse, vous pouvez utiliser les téléports pour retourner rapidement dans les chambres. De toute évidence, des pièces séparées ont été créées à la main et habitées par divers ennemis qui doivent être abattus. Lors de la progression vers les niveaux suivants du jeu, le joueur voit le même schéma encore et encore, seules les étapes deviennent plus grandes.

Jusqu'à présent, il semble que ce ne soit rien d'intéressant. Sur Internet, vous pouvez trouver de nombreux générateurs reliant des allées à des pièces aléatoires.

La fonction de générateur devient perceptible lorsque vous commencez à jouer. Les niveaux semblent ... un peu plus planifiés que ce à quoi on pourrait s'attendre par hasard. La salle des boss est toujours à une distance raisonnable du départ. Les pièces avec des ennemis sont toujours raisonnablement entrecoupées de pièces calmes, de bancs et d'intersections. Et le plus important - de nombreux coffres sont situés derrière les charnières avec une croix à sens unique.


La ligne rouge est un couloir à sens unique. Si vous voulez entrer dans une pièce avec un coffre, alors vous devez aller loin. La grande majorité des coffres sont situés soit à la fin d'une boucle à sens unique, soit assez profondément à l'intérieur du niveau, ce qui oblige le joueur à se battre dans de nombreuses pièces, juste pour atteindre le coffre. Il n'y a pas de récompense sans risque.

Le secret de ce passage est que les schémas généraux sont créés manuellement. Voici le diagramme utilisé pour générer le niveau indiqué ci-dessus.


Les salles normales sont des salles sélectionnées au hasard avec des ennemis, des salles d'intersection ou de grandes salles avec plusieurs sorties. Les récompenses (récompense) et le boss (boss) n'ont pas besoin d'être expliqués. Il ne montre pas les pièces «communicantes», c'est-à-dire les pièces sans ennemis, souvent avec des risques naturels. Les pièces restantes sont prédéfinies ou sélectionnées à partir d'une table de pièce spéciale.

Dans Gungeon, il existe de nombreux schémas de ce type appelés «flux» (flux). Aux niveaux Hollow, ils sont les moins (4), et dans le Gungeon Proper, les plus (8). Ce ne sont pas des schémas simples, leur conception est créée sur la base d'une certaine caractéristique qui peut être remarquée à plusieurs passages. Il peut s'agir d'une boucle géante, ou d'une fourche importante à bien des égards, ou de la nécessité de se rendre au banc pour passer le niveau. Ils sont si visibles que les coureurs de vitesse ont remarqué des différences et ont établi des horaires grâce auxquels vous pouvez trouver le patron le plus rapidement possible. J'ai préparé une liste complète des programmes qui peuvent être téléchargés à partir d'ici .

Vous avez peut-être remarqué que le modèle de flux et la carte ne correspondent pas complètement. Sous le banc, il y a une pièce supplémentaire. incompatible avec le schéma, et d'étranges salles de couloir . Étudions tout le processus, il contient beaucoup d'idées intelligentes.

Le processus commence par la sélection aléatoire d'un fichier de flux comme celui illustré ci-dessus. Il s'agit de la structure de données «graphique» , c'est-à-dire qu'elle stocke les interconnexions des pièces, mais pas leur emplacement. Chaque pièce contient des métadonnées sur le type de pièce et les connexions qu'elle devrait avoir. Les connexions ont une direction - chaque diagramme commence à partir du nœud racine, puis forme un arbre de nœuds enfants. Ensuite, des connexions supplémentaires rompent l'arborescence pour créer des boucles. Je pense que cela est principalement dû aux particularités du développement du jeu, mais cela simplifie la procédure d'analyse de la carte, car toutes les boucles ont clairement défini le début et la fin.

Conversion de flux


Un fichier de flux peut être converti de plusieurs façons. Tout d'abord, certaines pièces spécifiques seront remplacées par des séries de pièces de longueurs aléatoires. Cette fonction n'est utilisée qu'à des niveaux ultérieurs plus importants. De plus, certaines parties du fichier de flux ont des chemins alternatifs, et l'un d'eux est sélectionné au hasard. Cette fonction n'est utilisée que deux fois.

Ensuite, quelques nœuds supplémentaires sont «injectés». Cette fonction est assez flexible et est utilisée à de nombreuses fins différentes.

Chaque «injection» contient des données qui déterminent quel type d'objet doit être inséré, où il doit être inséré, la probabilité de création et toutes les conditions qui doivent être remplies (par exemple, la présence d'un tour principal , une malédiction élevée ou que le joueur n'a pas encore enregistré le personnage ) Par exemple, les salles secrètes sont généralement créées dans des impasses, mais ont une probabilité de 1/5 d'être attachées à n'importe quelle pièce. Ils ont 90% de chances de se produire et ne nécessitent aucune condition supplémentaire.

Presque toutes les pièces spéciales du jeu sont déterminées par l'injection du site, y compris les marchands (à l'exception du magasin principal), les prisons, les pièces avec cheminées et ascenseurs.


L'une des cellules de la prison qui peut être injectée dans un niveau

Au même stade, le générateur sélectionne une pièce spécifique pour chaque nœud. Cela dépend principalement de la scène actuelle et du type de salle nécessaire. Il y a une énorme liste de pièces - près de 300 pour la première étape - mais le générateur essaie de ne pas sélectionner deux fois la même pièce.

Les nœuds de connecteur fonctionnent différemment. Leurs chambres sont sélectionnées plus tard, tandis que le schéma est créé. Ce sont souvent des pièces longues et étroites, il est donc très important de choisir une pièce avec la bonne orientation.

Objets composés


Une fois la création du flux terminée, il est divisé en «objets composites». Chaque objet composite est soit une boucle distincte des pièces, soit un ensemble de pièces connectées sans boucles (c'est-à-dire un arbre ). Pour ce faire, recherchez la plus petite boucle sur la carte et découpez-la en tant qu'objet composite. L'opération est répétée jusqu'à ce qu'il n'y ait plus de boucles sur la carte. Le reste de la carte devient un ensemble d'arbres divisés et de connexions entre des objets composites individuels.


Le même flux après injection et fractionnement

Schéma d'objet composé


Ensuite, chaque objet composite est créé séparément, sur une carte distincte. Ils seront réunis plus tard.

Pour planifier un objet composé, la première pièce est placée dans un endroit arbitraire. Ensuite, les pièces sont ajoutées au circuit une par une en sélectionnant une paire de sorties, dont l'une se rapporte à la nouvelle pièce et l'autre au circuit existant. Les sorties sont des emplacements prédéfinis dans les métadonnées de chaque pièce. Ensuite, la nouvelle pièce est placée de sorte que sa sortie soit directement connectée à la sortie de la pièce précédente. Ensuite, le processus se répète.

Plus précisément, les objets d'arbre composite sont placés en traversant l'arbre en profondeur . L'algorithme ne sélectionne que les paires de sorties qui conduisent à l'apparition d'une nouvelle pièce sans se croiser avec les précédentes. En général, l'algorithme préfère choisir des sorties éloignées des sorties existantes. S'il est impossible de placer une pièce, elle reviendra et régénérera le choix des pièces, en répétant ce processus jusqu'à trois fois.

Pendant ce temps, les objets de boucle composite sont placés en ajoutant des éléments de la boucle tour à tour des deux côtés de la ligne. Pour commencer, les paires de sorties sont sélectionnées au hasard (la préférence est donnée aux murs opposés, est-ouest ou nord-sud). Lorsque la boucle est à moitié créée, elle commence à privilégier les paires de sorties qui réunissent deux bords ouverts de la boucle. Après avoir créé toutes les salles, l'algorithme doit ajouter une autre connexion entre les deux dernières salles. Il choisit une autre paire de sorties. Si possible, il conçoit entre ces sorties une petite pièce rectangulaire. Sinon, il cherche un chemin entre les sorties et crée une «pièce» qui n'est qu'un couloir étroit. La longueur du couloir devrait être de 4 à 30 unités (dans les mines jusqu'à 50).

Assemblage final


À ce stade, de petites parties séparées du donjon sont connectées les unes aux autres, mais les objets composites eux-mêmes doivent être connectés pour créer une carte complète.


La même carte que les objets composites avant l'assemblage final

Comme vous pouvez le voir, les composés restants dans ce cas ne donnent pas une très grande sélection. Mais il peut y avoir des cas plus complexes qu'auparavant. L'algorithme contourne la carte, en commençant par la pièce avec le plus de connexions. Comme précédemment, une paire de sorties est sélectionnée pour chaque connexion créée. Si deux pièces se trouvent dans des parties distinctes de la carte, ces deux parties de la carte sont alignées pour créer un court chemin. Sinon, une recherche d'itinéraire est utilisée pour créer l'itinéraire.

Et c'est là que la création du diagramme de niveau se termine. Il ne reste plus qu'à choisir les ennemis et les décorations des pièces, et c'est un sujet complètement différent.

En conclusion


Il semble que l'objectif principal des développeurs était de créer un générateur procédural qui offre un gameplay satisfaisant. Évidemment, pour qu'il soit correctement implémenté, ils ont dû effectuer de nombreuses itérations - j'ai trouvé une grande quantité de code de génération, qui, semble-t-il, n'est pas utilisé, car les développeurs ont changé leur formule procédurale à la recherche de la perfection.

Une astuce curieuse est qu'ils génèrent d'abord les parties les plus complexes / importantes de la carte. Le générateur se concentre sur la création de boucles étroites et de courts couloirs dans les parties très centrales du niveau, puis essaie de connecter tout le reste avec eux.

Comme dans le cas de mon étude de la génération de niveaux Diablo 1 , cela m'a frappé à quel point il est efficace de générer une partie du donjon sous une forme abstraite - dans ce cas, il s'agit d'un graphique sans information sur l'emplacement. Tout ne devient plus précis que plus tard. La fonction "injection" serait tout simplement impossible si nous allions immédiatement travailler avec une carte de tuiles. Grâce à l'abstraction des détails du placement des pièces, il vous permet de contrôler le style de jeu et l'échelle de niveau.

De plus, j'ai été impressionné par l'extensibilité du système dans son ensemble. Unity encourage une approche active basée sur les données . L'ajout d'une nouvelle pièce, d'un nouveau schéma ou même d'un comportement spécial peut être réalisé en ajoutant simplement de nouveaux objets aux tables correspondantes. Cela a dû être d'une grande aide, car Dodge Roll a déjà publié quelques DLC gratuits et, sans aucun doute, prend en charge la création de mods .



Bonus


L'étude de ce générateur a été ma première chance de rechercher la création d'un jeu professionnel dans Unity. Les développeurs de Dodge Roll ont fait de leur mieux et ont écrit du bon code. Il est bien lu et, dans certains endroits, assez drôle - il semble que leur amour des jeux de mots s'est propagé au code. J'ai aimé ceux-ci:

  • Le moteur fluide du jeu s'appelle DeadlyDeadlyGoopManager
  • Le code de génération de donjon est appelé Dungeonator
  • Les différentes étapes sont appelées CASTLEGEON/GUNGEON/MINEGEON/CATACOMBGEON etc. Je me demande si les développeurs se sont inspirés de Diablo 1, qui utilise un schéma très similaire?
  • Littéralement, chaque pièce a son propre nom, généralement sous la forme d'un jeu de mots (ou en l'honneur de certains Joe; c'est probablement un artiste avec une grande vanité).

J'ai également remarqué qu'au départ le studio avait des projets de scènes sur les thèmes de l'espace, de la jungle et du Far West. Hélas, ils n'étaient pas destinés à apparaître. Dodge Roll a décidé que son travail sur Gungeon était terminé . J'attendrai leur prochain match et j'espère qu'ils y mettront autant d'amour et d'attention.

Source: https://habr.com/ru/post/fr462377/


All Articles