Dungeons in der Bindung von Isaac generieren



Binding of Isaac und sein Remake Binding Of Isaac: Rebirth sind einige meiner Lieblingsspiele. Sie gehören zum Roguelite Twin Stick Shooter-Genre und sind Enter the Gungeon sehr Àhnlich .



Die durch diese Spiele erzeugten Dungeons sind besonders berĂŒhmt. Ich habe im Internet unzĂ€hlige Tutorials zum Erstellen einer Generation im Isaac-Stil gesehen, aber ich habe mich gefragt, wie sie im Original implementiert wurde. Zu meiner Überraschung beschreiben die meisten Tutorials den Prozess falsch. In diesem Artikel werde ich darĂŒber sprechen, wie die Generierung funktioniert, und ein Beispiel dafĂŒr in einer Javascript-Demo zeigen.



Obwohl ich mein staubiges Flash-Wissen dekompilieren und aktualisieren musste (ich habe einmal meinen eigenen Actionscript-Dekompiler geschrieben), hatte ich auch großes GlĂŒck: Entwickler IsaacFlorian Himsl und einer der Hauptentwickler von Rebirth, Simon Parser , beantworteten meine Fragen gerne. TatsĂ€chlich hat Florian kĂŒrzlich sogar ein Video aufgenommen , das den Algorithmus beschreibt. Auf seinem Kanal können Sie auch die Details der Entwicklung seines neuen Spiels Squid Invaders erfahren.



Angesichts des Vorhandenseins seiner Geschichte kann mein Artikel als ĂŒberflĂŒssig angesehen werden. Wenn Sie jedoch blutige Details wĂŒnschen, lesen Sie weiter.



Grundlegender Algorithmus



Isaacs Entwickler waren stark von den 2D-Spielen der Zelda-Serie inspiriert und erstellten Karten, die ihren Dungeons Àhnelten.





Dies ist eine Reihe von quadratischen RĂ€umen, die durch Kanten miteinander verbunden sind. Einige Zimmer sind etwas Besonderes - auf jeder Etage gibt es immer ein GeschĂ€ft , eine Schatzkammer und einen Chef . DarĂŒber hinaus werden mehrere andere spezielle RĂ€ume nach dem Zufallsprinzip ausgewĂ€hlt. Außer dem geheimen Raum gibt es keine Schleifen im Verlies.



Das Spiel selbst besteht aus einer linearen Passage solcher Levels, normalerweise gibt es zwei davon pro "Kapitel". WĂ€hrend des Passierens werden die Karten etwas grĂ¶ĂŸer und der Inhalt der RĂ€ume Ă€ndert sich, aber der Algorithmus zum Erstellen ihrer Struktur bleibt tatsĂ€chlich jedes Mal der gleiche.



Die erste Version von Isaac wurde in weniger als 3 Monaten entwickelt, daher musste Himslu seine Zeit unglaublich effizient nutzen. Das grundlegende Design des Spiels ist schlank und einfach. ZunÀchst wird ein Grundriss (Ebene) erstellt. Dann werden einige RÀume als besonders ausgewÀhlt. Dann wird das Innere jedes Raumes aus dem entsprechenden Pool ausgewÀhlt.



GebÀudeplan



Isaac wird in einem 9x8-Raster generiert. Der Einfachheit halber werden die Zellen durch Zahlen gekennzeichnet - Einsen geben die X-Position an, Zehner - die Y-Position. Dies bedeutet, dass Sie sich nach oben, unten, links und rechts bewegen können, indem Sie einfach +10, -10, +1 und -1 hinzufĂŒgen. Zellen mit einer X-Position von 0 werden nicht verwendet (immer leer), was bedeutet, dass sich der grĂ¶ĂŸte Teil des Codes nicht um Kartengrenzen kĂŒmmern muss. Das heißt, die obere linke Zelle der Karte ist 01 und die untere rechte Zelle ist 79.



Der Grundriss bestimmt nur, welche Zellen RÀume enthalten - der Inhalt des Raums wird spÀter ausgewÀhlt.



ZunÀchst bestimmt die Formel random(2) + 5 + level * 2.6die Anzahl der RÀume. Jene. Die Level beginnen bei 7 oder 8 RÀumen und erhöhen sich jedes Mal um 2 oder 3 RÀume.



Das Spiel stellt dann den Startraum (Zelle 35) in die Warteschlange. Dann durchlĂ€uft es die Warteschlange. FĂŒr jede Zelle in der Warteschlange werden die 4 Hauptrichtungen durchlaufen und die folgenden Schritte ausgefĂŒhrt:



  • Bestimmt die benachbarte Zelle durch HinzufĂŒgen von + 10 / -10 / + 1 / -1 zur aktuellen Zelle.
  • Wenn die benachbarte Zelle bereits belegt ist, fĂŒhrt das Spiel nichts aus.
  • Wenn die Nachbarzelle selbst mehr als einen gefĂŒllten Nachbarn hat, tut das Spiel nichts.
  • Wenn auf dem Level bereits genĂŒgend RĂ€ume vorhanden sind, fĂŒhrt das Spiel nichts aus.
  • Das Spiel macht nichts mit einer Wahrscheinlichkeit von 50%.
  • Andernfalls markiert das Spiel die benachbarte Zelle als den Raum enthaltend und fĂŒgt ihn der Warteschlange hinzu.


Wenn eine Zelle keiner der benachbarten Zellen einen Raum hinzufĂŒgt, ist dies eine Sackgasse und kann zur weiteren Verwendung zur Liste der ZielrĂ€ume hinzugefĂŒgt werden.



Wenn Karten mehr als 16 RĂ€ume benötigen, wird der Startraum regelmĂ€ĂŸig erneut in die Warteschlange gestellt, um das Wachstum zu stimulieren.



Da der oben beschriebene Algorithmus mit einem einzelnen Raum beginnt und sich viele Male nach außen ausdehnt, handelt es sich im Wesentlichen um eine umfassende erste Untersuchung. Die EinschrĂ€nkung, dass ein Raum nicht hinzugefĂŒgt werden darf, wenn bereits zwei Nachbarn vorhanden sind, unterteilt RĂ€ume in separate Korridore, die niemals in Schleifen zusammenkommen.



Der Grundriss wird dann auf Konsistenz geprĂŒft. Es sollte die erforderliche Anzahl von RĂ€umen enthalten, und der Chefraum sollte sich nicht neben dem Startraum befinden. Andernfalls beginnt die Generierung von vorne.



Besondere RĂ€ume



Boss-RĂ€ume werden platziert, indem der letzte Punkt aus der Endraumliste gelesen wird. Aufgrund der Tatsache, dass die Erzeugung als nach außen gerichtetes Wachstum durchgefĂŒhrt wird, wird dies immer einer der RĂ€ume sein, die sich am weitesten vom Startraum entfernt befinden.



Dann wird die Position des geheimen Raums angezeigt. Diese RĂ€ume werden dem Grundriss hinzugefĂŒgt; Sie sind eine der wenigen Ausnahmen von der Regel, die das Platzieren von RĂ€umen neben mehreren vorhandenen verbietet. TatsĂ€chlich zieht der Algorithmus es im Gegenteil vor, sie so zu platzieren. Der Generator sucht zufĂ€llig nach einer leeren Zelle neben mindestens drei RĂ€umen und nicht in der NĂ€he eines der EndrĂ€ume. Wenn er es nach 300 Versuchen nicht findet, schwĂ€cht es das Suchkriterium leicht und nach 600 Versuchen schwĂ€cht es es noch mehr. Dieses Verfahren stellt sicher, dass der geheime Raum immer auf der Ebene platziert wird, aber normalerweise werden sie in der NĂ€he von Kreuzungen zusammengedrĂŒckt, was bedeutet, dass sich immer viele RĂ€ume in ihrer NĂ€he befinden.



Fast alle anderen speziellen RÀume befinden sich in zufÀlligen EndrÀumen. Einige Zimmer sind garantiert, andere haben eine kleine Chance oder ein kleines Kriterium. Zum Beispiel erscheinen OpferrÀume eines von sieben Mal; Wenn der Spieler bei voller Gesundheit ist, treten sie ungefÀhr jedes dritte Mal auf.



RegelmĂ€ĂŸige Zimmer



Benachbarte RĂ€ume haben immer eine TĂŒr (oder eine zerbrechliche Wand) genau in der Mitte, und jeder Raum ist so konzipiert, dass er aus allen vier Richtungen zugĂ€nglich ist. Daher sind bei der Auswahl der RĂ€ume keine besonderen Überlegungen erforderlich - jede Kombination reicht aus.



Die Zimmer werden zufĂ€llig aus dem Pool ausgewĂ€hlt. Informationen ĂŒber RĂ€ume enthalten sowohl Strukturen (Gruben, Feuer, Steine ​​usw.) als auch Monster. Beide unterliegen zufĂ€lligen Variationen, wie dem Aussehen von Champion-Monstern und roten Kaminen.



FĂŒr normale Zimmer gibt es drei Pools: leicht, mittel und schwer. Die erste Stufe des Kapitels wĂ€hlt aus einfachen und mittleren RĂ€umen und die zweite aus mittleren und schwierigen. Das erste Kapitel (Keller) enthĂ€lt 174 gewöhnliche RĂ€ume in Pools. "Alternative Kapitel" wie "Keller", der zufĂ€llig den Keller ersetzt, haben etwas andere RĂ€ume.



Fluch des Labyrinths



Eine der interessantesten zusĂ€tzlichen Funktionen des Codes sind die Karten mit doppelter GrĂ¶ĂŸe. Sie werden zufĂ€llig und nur fĂŒr einige Herausforderungsmodi erstellt. Neben der offensichtlichen Verdoppelung der Anzahl der SonderrĂ€ume und zweier benachbarter ChefrĂ€ume weisen sie auch viele kleine Details auf:



  • 80% mehr normale RĂ€ume (max 45)
  • Nur die 6 entfernten RĂ€ume werden fĂŒr spezielle RĂ€ume verwendet
  • Ebenen wĂ€hlen Zimmer aus Pools von einfachen, mittleren und komplexen Zimmern.
  • ZusĂ€tzliche normale RĂ€ume werden dem Grundriss zufĂ€llig mit einer Platzierungslogik hinzugefĂŒgt, die geheimen RĂ€umen Ă€hnelt.


Demo



Ich habe ein vereinfachtes Beispiel fĂŒr einen Generator in Javascript erstellt, damit Sie damit experimentieren können. Den vollstĂ€ndigen Code finden Sie hier und ein funktionierendes Beispiel finden Sie im Originalartikel .





Wiedergeburt





Bindung von Isaac: Rebirth ist ein Remake der ursprĂŒnglichen Bindung von Isaac von Nicalis , die zu dieser Zeit fĂŒr ihre VVVVV- und Cave Story- Ports berĂŒhmt war . Das Spiel wurde auf C ++ portiert und alle Sounds und Grafiken wurden ĂŒberarbeitet. Im Laufe der Jahre hat das Spiel viele DLCs erhalten, die der bereits beeindruckenden Liste des Originals neue GegenstĂ€nde und Feinde hinzufĂŒgen.



WĂ€hrend Rebirth eine Reihe interessanter Innovationen aufweist, war der Hauptbeitrag zur Levelgenerierung die HinzufĂŒgung grĂ¶ĂŸerer, unregelmĂ€ĂŸiger RĂ€ume.





Mit einem vollstĂ€ndigen Satz von DLCs (zum Zeitpunkt dieses Schreibens ist dies Afterbirth +) verfĂŒgt das Spiel ĂŒber 11 große RĂ€ume: 2 × 2, 2 × 1, L-förmige und schmale Korridore in verschiedenen Rotationsoptionen.





Typischer L-förmiger Raum, dreimal so groß wie ein normaler Raum. Es wurde von Simon Parser durch sorgfĂ€ltige Änderung des Himsla-Quellcodes implementiert.



Anstatt alle Richtungen zu durchlaufen, umgeht der Algorithmus alle AusgÀnge aus dem Raum. In einem 2x2-Raum können bis zu acht davon vorhanden sein.



Wenn es darum geht, einen Raum einzufĂŒgen, versucht er zufĂ€llig, stattdessen einen großen Raum einzufĂŒgen. Nachbarkontrollen werden weiterhin angewendet, jedoch nur fĂŒr die erste Zelle neben der TĂŒr. Der Algorithmus prĂŒft jedoch, ob genĂŒgend Platz fĂŒr den Rest des Raums vorhanden ist. Dies bedeutet, dass in großen RĂ€umen ebene Scharniere entstehen können. Normalerweise werden zwei große RĂ€ume nebeneinander erzeugt und durch ein Paar TĂŒren ergĂ€nzt, die sie verbinden.



Wenn nicht genĂŒgend Platz fĂŒr den Raum vorhanden ist, versucht der Algorithmus, einen anderen Kandidaten einzufĂŒgen. Wenn große RĂ€ume erfolgreich eingefĂŒgt werden, besteht eine Wahrscheinlichkeit von 95%, dass sie aus dem Pool entfernt werden.



FĂŒr die großen ChefrĂ€ume wird noch mehr Code benötigt. Denken Sie daran, dass sich die ChefrĂ€ume immer so weit wie möglich vom Startraum entfernt befinden. Wenn ein grĂ¶ĂŸerer Raum gewĂŒnscht wird, ersetzt der Generator den vorgesehenen Einzelraum. Da Boss-RĂ€ume beim Ersetzen immer Sackgassen sind, prĂŒft der Algorithmus, ob sie an einige zusĂ€tzliche RĂ€ume angrenzen. Manchmal ist ein Austausch immer noch nicht möglich, daher werden alle Endpunkte in maximaler Entfernung vom Startraum ĂŒberprĂŒft. Wenn sie nicht passen, gibt der Algorithmus auf.



Bei geheimen RĂ€umen werden benachbarte RĂ€ume auf dem Grundriss fĂŒr die Platzierung berĂŒcksichtigt, und RĂ€ume werden nur ausgewĂ€hlt, wenn der Algorithmus feststellt, dass keine TĂŒren benötigt werden.





In Isaac sind AbgrĂŒnde normalerweise nicht zu ĂŒberwinden



Ausgabe



Der Isaac Level Generator ist nicht der raffinierteste, den ich je gesehen habe, aber trotz der geringen Menge an Code funktioniert er unglaublich gut. Dies ist wahrscheinlich der Grund, warum sie versuchen, es so oft neu zu erstellen. Seine Einfachheit ermöglicht Änderungen und Erweiterungen, wie wir am Beispiel der Wiedergeburt sehen können. Ein unglaubliches Ergebnis.



Sie können auch feststellen, dass dieses Spiel den Trend fortsetzt, Grundrisse getrennt von Raumdetails zu erstellen. In meinen Artikeln ĂŒber Diablo 1 [ Übersetzung in HabrĂ©] und Enter the Gungeon [ Übersetzung in HabrĂ©] habe ich gesagt, warum dieser Ansatz sehr mĂ€chtig sein kann.



Beim Dekompilieren des Codes habe ich keine besonders interessanten Details gefunden. Das Interessanteste, was ich sagen kann, ist, dass der Ort der Schatzkammer in einer Variablen namens "boner" gespeichert ist - wahrscheinlich die AbkĂŒrzung fĂŒr Bonus Room. Der Code enthĂ€lt auch Feinheiten in Bezug auf geringfĂŒgige Nebenwirkungen verschiedener Elemente, aber ich ĂŒberlasse dieses Thema den Analysatoren .



Als nĂ€chstes können Sie Himslas Videoserie ĂŒber die Interna des Spiels ansehen oder sogar Isaac spielen und alle Level live sehen. Ich habe gehört, dass der neue Repentance DLC dieses Jahr herauskommt. Ich empfehle auch, andere Spiele von Chefdesigner Edmund McMillen (insbesondere Super Meat Boy) zu spielen.



All Articles