Wie Dungeons in Enter The Gungeon generiert werden

Vor kurzem habe ich viel in Enter The Gungeon gespielt . Dies ist ein fantastisches, furchtbar herausforderndes Bullet-Hell-Spiel, das mich sehr an Binding of Isaac erinnert . Aber je mehr ich es spielte, desto mehr erkannte ich das subtile Genie des Dungeon-Designs.


Es gibt viele prozedurale Generatoren, die logische Ebenenschemata erstellen, die das richtige Spieltempo sicherstellen und die Spieler belohnen, und es gibt andere Generatoren, die Ebenen mit Schleifen und kompakten Schemata erstellen. Es ist jedoch selten, dass beide Typen in einem Spiel gefunden werden. Das einzige mir bekannte Spiel, in dem versucht wurde, so etwas zu implementieren, ist Unexplored .

Also habe ich natĂŒrlich den Dekompiler gestartet, damit Gungeon mir alle seine Geheimnisse preisgibt . In diesem Artikel werde ich Ihnen mitteilen, was ich gefunden habe.



Auf den ersten Blick scheinen die Gungeon- Levels ziemlich einfach zu sein. Hier ist ein typisches Kartenbeispiel.


Typische Level 1 Karte

Der Spieler beginnt am Eingang. rennt durch die Truhen und Ladenbesitzer Beute sammeln und dann endlich den Boss besiegen . Wenn Sie in eine lange Sackgasse geraten, können Sie mithilfe von Teleports schnell in die Zimmer zurĂŒckkehren. Offensichtlich wurden separate RĂ€ume von Hand geschaffen und von verschiedenen Feinden bewohnt, die erschossen werden mĂŒssen. Wenn der Spieler zu den nĂ€chsten Levels des Spiels ĂŒbergeht, sieht er immer wieder dasselbe Muster, nur die Stufen werden grĂ¶ĂŸer.

Bisher scheint dies nichts Interessantes zu sein. Im Internet finden Sie viele Generatoren, die GÀnge mit zufÀlligen RÀumen verbinden.

Die Generatorfunktion macht sich bemerkbar, wenn Sie mit dem Spielen beginnen. Die Levels scheinen ... etwas geplanter zu sein, als man es zufĂ€llig erwarten könnte. Der Chefraum ist immer einen angemessenen Abstand vom Start. RĂ€ume mit Feinden sind immer einigermaßen mit ruhigen RĂ€umen, BĂ€nken und Kreuzungen durchsetzt. Und vor allem: Viele Truhen befinden sich hinter den Scharnieren mit Einwegkreuz.


Die rote Linie ist ein Einbahnstraßenkorridor. Wenn Sie in einen Raum mit einer Truhe gelangen möchten, mĂŒssen Sie einen langen Weg zurĂŒcklegen. Die ĂŒberwiegende Mehrheit der Truhen befindet sich entweder am Ende einer Einwegschleife oder tief genug im Level, wodurch der Spieler gezwungen ist, sich durch viele RĂ€ume zu kĂ€mpfen, um nur die Truhe zu erreichen. Es gibt keine Belohnung ohne Risiko.

Das Geheimnis dieser Passage ist, dass allgemeine Schemata manuell erstellt werden. Hier ist das Diagramm, das zum Erzeugen des oben gezeigten Pegels verwendet wird.


Normale RĂ€ume sind zufĂ€llig ausgewĂ€hlte RĂ€ume mit Feinden, KreuzungsrĂ€ume oder große RĂ€ume mit mehreren AusgĂ€ngen. Die Belohnungen (Belohnung) und der Boss (Boss) mĂŒssen nicht erklĂ€rt werden. Es werden keine "verbindenden" RĂ€ume angezeigt, dh RĂ€ume ohne Feinde, oft mit Naturgefahren. Die ĂŒbrigen RĂ€ume sind entweder vordefiniert oder werden aus einem speziellen Raumtisch ausgewĂ€hlt.

In Gungeon gibt es einige solcher Schemata, die als "Flows" (Flow) bezeichnet werden. In den Hollow-Levels sind sie am wenigsten (4) und im Gungeon Proper am meisten (8). Dies sind keine einfachen Schemata, ihr Design wird auf der Grundlage eines bestimmten Merkmals erstellt, das bei mehreren DurchgÀngen bemerkt werden kann. Es kann in vielerlei Hinsicht eine riesige Schleife oder eine wichtige Gabel sein oder die Notwendigkeit, zur Bank zu gelangen, um das Level zu passieren. Sie sind so auffÀllig, dass Speedrunner Unterschiede bemerkten und ZeitplÀne aufstellten, nach denen Sie den Boss so schnell wie möglich finden können. Ich habe eine vollstÀndige Liste der Schemata erstellt, die hier heruntergeladen werden können .

Möglicherweise haben Sie bemerkt, dass das Flussmuster und die Karte nicht vollstĂ€ndig ĂŒbereinstimmen. Unter der Bank gibt es einen zusĂ€tzlichen Raum. im Widerspruch zum Schema und seltsame KorridorrĂ€ume . Lassen Sie uns den gesamten Prozess untersuchen, er enthĂ€lt viele kluge Ideen.

Der Prozess beginnt mit der zufĂ€lligen Auswahl einer Stream-Datei wie der oben gezeigten. Dies ist die "Graph" -Datenstruktur , dh sie speichert die Verbindungen von RĂ€umen, jedoch nicht deren Standort. Jeder Raum enthĂ€lt Metadaten ĂŒber den Raumtyp und die Verbindungen, die er haben sollte. Verbindungen haben eine Richtung - jedes Flussdiagramm beginnt am Wurzelknoten und bildet dann einen Baum von untergeordneten Knoten. Dann unterbrechen zusĂ€tzliche Verbindungen die Baumstruktur, um Schleifen zu erstellen. Ich denke, dass dies hauptsĂ€chlich auf die Merkmale der Entwicklung des Spiels zurĂŒckzufĂŒhren ist, aber es vereinfacht das Verfahren zur Analyse der Karte, da alle Schleifen Anfang und Ende klar definiert haben.

Stream-Konvertierung


Eine Stream-Datei kann auf eine begrenzte Anzahl von Arten konvertiert werden. ZunĂ€chst werden einige bestimmte RĂ€ume durch eine Reihe von RĂ€umen mit zufĂ€lliger LĂ€nge ersetzt. Diese Funktion wird nur in spĂ€teren, grĂ¶ĂŸeren Ebenen verwendet. DarĂŒber hinaus verfĂŒgen einige Teile der Stream-Datei ĂŒber alternative Pfade, von denen einer zufĂ€llig ausgewĂ€hlt wird. Diese Funktion wird nur zweimal verwendet.

Dann werden einige zusĂ€tzliche Knoten "injiziert". Diese Funktion ist sehr flexibel und wird fĂŒr viele verschiedene Zwecke verwendet.

Jede „Injektion“ enthĂ€lt Daten, die bestimmen, welcher Objekttyp eingefĂŒgt werden soll, wo er eingefĂŒgt werden soll, die Wahrscheinlichkeit der Erstellung und alle Bedingungen, die erfĂŒllt sein mĂŒssen (z. B. das Vorhandensein einer Meisterrunde , ein hoher Fluch oder dass der Spieler den Charakter noch nicht gespeichert hat ) Beispielsweise werden geheime RĂ€ume normalerweise in Sackgassen erstellt, haben jedoch eine Wahrscheinlichkeit von 1/5, dass sie an einen Raum angehĂ€ngt werden. Sie haben eine Wahrscheinlichkeit von 90% und erfordern keine zusĂ€tzlichen Bedingungen.

Fast jeder spezielle Raum im Spiel wird durch die Injektion des GelĂ€ndes bestimmt, einschließlich HĂ€ndler (ohne HauptgeschĂ€ft), GefĂ€ngnisse, RĂ€ume mit Kaminen und AufzĂŒgen.


Eine der GefÀngniszellen, die in ein Level injiziert werden kann

Gleichzeitig wĂ€hlt der Generator fĂŒr jeden Knoten einen bestimmten Raum aus. Dies hĂ€ngt hauptsĂ€chlich von der aktuellen Phase und der Art des benötigten Raums ab. Es gibt eine riesige Liste von RĂ€umen - fast 300 fĂŒr die erste Stufe - aber der Generator versucht, nicht zweimal denselben Raum auszuwĂ€hlen.

Verbindungsknoten funktionieren anders. Ihre RÀume werden spÀter ausgewÀhlt, wÀhrend das Schema erstellt wird. Oft sind dies lange und schmale RÀume, daher ist es sehr wichtig, einen Raum mit der richtigen Ausrichtung zu wÀhlen.

Zusammengesetzte Objekte


Nachdem die Erstellung des Streams abgeschlossen ist, wird er in „zusammengesetzte Objekte“ unterteilt. Jedes zusammengesetzte Objekt ist entweder eine separate Schleife von RĂ€umen oder eine Reihe verbundener RĂ€ume ohne Schleifen (d. H. Ein Baum ). Dies wird erreicht, indem die kleinste Schleife auf der Karte gefunden und als zusammengesetztes Objekt ausgeschnitten wird. Der Vorgang wird wiederholt, bis keine Schleifen mehr auf der Karte vorhanden sind. Der Rest der Karte wird zu einer Reihe von geteilten BĂ€umen und Verbindungen zwischen einzelnen zusammengesetzten Objekten.


Der gleiche Strom nach Injektion und Aufspaltung

Zusammengesetztes Objektschema


Anschließend wird jedes zusammengesetzte Objekt separat auf einer separaten Karte erstellt. Sie werden spĂ€ter zusammengefĂŒgt.

Um ein zusammengesetztes Objekt zu planen, wird der erste Raum an einer beliebigen Stelle platziert. Anschließend werden der Schaltung nacheinander RĂ€ume hinzugefĂŒgt, indem ein Paar von AusgĂ€ngen ausgewĂ€hlt wird, von denen sich einer auf den neuen Raum und der andere auf den vorhandenen Schaltkreis bezieht. AusgĂ€nge sind vordefinierte Positionen in den Metadaten jedes Raums. Dann wird der neue Raum so platziert, dass sein Ausgang direkt mit dem Ausgang des vorherigen Raums verbunden ist. Dann wiederholt sich der Vorgang.

Insbesondere werden die zusammengesetzten Baumobjekte platziert, indem der Baum in der Tiefe durchlaufen wird. Der Algorithmus wĂ€hlt nur die Ausgangspaare aus, die zum Erscheinen eines neuen Raums fĂŒhren, ohne sich mit den vorherigen zu ĂŒberschneiden. Im Allgemeinen bevorzugt der Algorithmus die Auswahl von Ausgaben, die weit von den vorhandenen entfernt sind. Wenn es unmöglich ist, einen Raum zu platzieren, wird er zurĂŒckgehen und die Auswahl der RĂ€ume neu generieren, wobei dieser Vorgang bis zu dreimal wiederholt wird.

In der Zwischenzeit werden zusammengesetzte Schleifenobjekte platziert, indem Elemente aus der Schleife nacheinander auf beiden Seiten der Linie hinzugefĂŒgt werden. ZunĂ€chst werden Ausgangspaare zufĂ€llig ausgewĂ€hlt (gegenĂŒberliegende WĂ€nde, Ost-West oder Nord-SĂŒd, werden bevorzugt). Wenn die Schleife zur HĂ€lfte erstellt ist, werden die Ausgangspaare bevorzugt, die zwei offene Kanten der Schleife zusammenfĂŒhren. Nach dem Erstellen aller RĂ€ume muss der Algorithmus eine weitere Verbindung zwischen den letzten beiden RĂ€umen hinzufĂŒgen. Er wĂ€hlt ein weiteres Paar AusgĂ€nge. Wenn möglich, entwirft er zwischen diesen AusgĂ€ngen einen kleinen rechteckigen Raum. Ansonsten sucht er nach einem Weg zwischen den AusgĂ€ngen und schafft einen „Raum“, der einfach ein schmaler Korridor ist. Die LĂ€nge des Korridors sollte 4 bis 30 Einheiten betragen (in Minen bis zu 50).

Endmontage


In diesem Stadium sind kleine separate Teile des Dungeons miteinander verbunden, aber die zusammengesetzten Objekte selbst mĂŒssen verbunden werden, um eine vollstĂ€ndige Karte zu erstellen.


Dieselbe Karte wie zusammengesetzte Objekte vor der Endmontage

Wie Sie sehen können, ergeben die verbleibenden Verbindungen in diesem Fall keine sehr große Auswahl. Es kann jedoch komplexere FĂ€lle als zuvor geben. Der Algorithmus umgeht die Karte und beginnt mit dem Raum mit den meisten Verbindungen. Nach wie vor wird fĂŒr jede erstellte Verbindung ein Ausgangspaar ausgewĂ€hlt. Wenn sich zwei RĂ€ume in getrennten Teilen der Karte befinden, werden diese beiden Teile der Karte ausgerichtet, um einen kurzen Pfad zu erstellen. Andernfalls wird eine Routensuche verwendet, um die Route zu erstellen.

Und hier endet die Erstellung des Level-Diagramms. Es bleibt nur die Wahl von Feinden und Dekorationen fĂŒr RĂ€ume, und dies ist ein ganz anderes Thema.

Abschließend


Es scheint, dass das Hauptziel der Entwickler darin bestand, einen prozeduralen Generator zu erstellen, der ein zufriedenstellendes Gameplay bietet. Um korrekt implementiert zu werden, mussten natĂŒrlich viele Iterationen durchgefĂŒhrt werden. Ich habe eine große Menge an Generierungscode gefunden, der anscheinend nicht verwendet wird, da Entwickler ihre Verfahrensformel auf der Suche nach Perfektion geĂ€ndert haben.

Ein merkwĂŒrdiger Trick ist, dass sie zuerst die komplexesten / wichtigsten Teile der Karte erzeugen. Der Generator konzentriert sich darauf, enge Schleifen und kurze Korridore in den sehr zentralen Teilen der Ebene zu erstellen, und versucht dann, alles andere mit ihnen zu verbinden.

Wie bei meiner Studie zur Generierung von Diablo 1-Levels fiel mir auf, wie effizient es ist, einen Teil des Dungeons in abstrakter Form zu generieren - in diesem Fall handelt es sich um eine Grafik ohne Informationen zum Standort. Alles wird erst spĂ€ter genauer. Die "Injektions" -Funktion wĂ€re einfach unmöglich, wenn wir sofort mit einer Kachelkarte arbeiten wĂŒrden. Dank der Abstraktion von den Details der Platzierung von RĂ€umen können Sie den Stil des Spiels und die Levelskala steuern.

DarĂŒber hinaus war ich von der Erweiterbarkeit des gesamten Systems beeindruckt. Unity fördert einen aktiven datengesteuerten Ansatz. Das HinzufĂŒgen eines neuen Raums, Schemas oder sogar eines speziellen Verhaltens kann durch einfaches HinzufĂŒgen neuer Objekte zu den entsprechenden Tabellen realisiert werden. Dies muss eine große Hilfe gewesen sein, da Dodge Roll bereits einige kostenlose DLCs veröffentlicht hat und ohne Zweifel die Erstellung von Mods unterstĂŒtzt .



Boni


Das Studium dieses Generators war meine erste Gelegenheit, die Entwicklung eines professionellen Spiels in Unity zu erforschen. Die Entwickler von Dodge Roll haben ihr Bestes gegeben und guten Code geschrieben. Es ist gut gelesen und an einigen Stellen ziemlich lustig - es scheint, dass sich ihre Liebe zu Wortspielen auf den Code ausgeweitet hat. Ich mochte diese:

  • Die Fluid Engine im Spiel heißt DeadlyDeadlyGoopManager
  • Der Dungeon-Generierungscode wird als Dungeonator
  • Die verschiedenen Schritte heißen CASTLEGEON/GUNGEON/MINEGEON/CATACOMBGEON usw. Ich frage mich, ob die Entwickler von Diablo 1 inspiriert wurden, das ein sehr Ă€hnliches Schema verwendet.
  • BuchstĂ€blich hat jeder Raum seinen eigenen Namen, normalerweise in Form eines Wortspiels (oder zu Ehren eines Joe; wahrscheinlich ist dies ein KĂŒnstler mit großer Einbildung).

Mir ist auch aufgefallen, dass das Studio ursprĂŒnglich PlĂ€ne fĂŒr BĂŒhnen zu den Themen Weltraum, Dschungel und Wilder Westen hatte. Leider waren sie nicht dazu bestimmt zu erscheinen. Dodge Roll entschied, dass ihre Arbeit an Gungeon abgeschlossen war . Ich werde auf ihr nĂ€chstes Spiel warten und hoffe, dass sie so viel Liebe und Aufmerksamkeit in es stecken.

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


All Articles