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 KarteDer 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 kannGleichzeitig 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 AufspaltungZusammengesetztes 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 EndmontageWie 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.