Interview: Wie funktioniert die Levelgenerierung im Brogue?

Roguelikes sind mein Lieblingsspielgenre undBrogue[offizielle Seite] ist eines meiner Lieblings-Roguelikes. Es verfügt über die sorgfältig ineinandergreifenden Systeme des Genres, die den Spieler zu wichtigen Entscheidungen treiben und jede Menge unterhaltsame Anekdoten hervorbringen, präsentiert sie aber auch über eine leicht zugängliche Benutzeroberfläche und ohne die Aufgeblasenheit, die das Spielen anderer einschüchternd oder ermüdend machen kann.

Ich denke, ein großer Teil davonBrogueDer Reiz von liegt in der Levelgenerierung, die enge Räume voller interessanter Umgebungsdetails schafft, mit Fallen, denen man ausweichen muss, Abgründen, in die man fallen kann, und einer seltsamen ASCII-Schönheit. Ich habe mit dem Schöpfer des Spiels, Brian Walker, darüber gesprochen, was seine Designziele für diese Level sind, wie man ein Spiel ausbalanciert, das man nicht vorhersagen kann, und über den genauen Prozess, mit dem das Spiel diese Level erstellt.

Notiz:Vor ein paar Monaten habe ich einen Aufruf zur Einreichung von Artikelideen aus der Supporter-Community herausgegeben, genannt „Journalist für Volksspiele. Ich war langsam, aber dieser Artikel ist der erste von hoffentlich vielen, die aus Ihren Ideen hervorgegangen sind. Dieser Artikel ist insbesondere eine Antwort auf eine Anfrage des Lesers amateurviking nach weiteren Interviews, die sich ausführlich mit der Entstehung eines einzelnen Teils eines Spiels befassen. Vielen Dank für die Unterstützung der Seite, Amateurviking!

RPS: Was waren Ihre Ziele für die Level-Generation in Brogue?

Brian Walker:Mein Hauptziel war, dass sich der Dungeon konkret und aufregend anfühlt – nicht nur ein flacher Untergrund für Monster und Gegenstände, sondern ein lebendiger und atmosphärischer Ort zum Erkunden, gefüllt mit nützlichen Informationen und taktischer Bedeutung. Indiana Jones ist eine gute Vorlage: ein einsamer Abenteurer an einem feindlichen Ort, geführt vom Fackelschein, auf der Suche nach Hinweisen, auf der Jagd nach Schätzen, der mit seinem Verstand überlebt, nie zu wissen, wann eine höllische Maschinerie aktiviert wird und den Boden zum Einsturz bringt, oder Fleisch- Ratten zu fressen, um aus den Wänden zu brechen, oder Wasser, um das Gebiet zu überschwemmen. Ich möchte, dass es eine handgestaltete Qualität hat, die sich schrittweise offenbart, wenn man entdeckt, dass ein versteckter Hebel einen verwinkelten, mit Würmern gefüllten Durchgang zu einem Schlüssel öffnet, der einen Tresorraum mit versteckten Artefakten öffnet. Prozedural generierte Levels werden wahrscheinlich nie ganz die Lücke zu handgefertigten Levels schließen, die von Experten entworfen wurden, aber ich möchte sie so nah wie möglich an diesen Standard heranführen – auch aus egoistischen Gründen, damit ich neue Level erkunden und überrascht werden kann durch seine Geheimnisse wie jeder andere Spieler.

RPS: Wie sieht die Schritt-für-Schritt-Anleitung – sagen wir mal – für die prozedurale Generierung von Brogue-Levels aus? Bitte seien Sie konkret.

Wanderer:Der Algorithmus beginnt mit einem Raum, der zufällig in einem leeren Raster platziert wird. Dann zeichnet es einen anderen Raum auf einem anderen Raster, das es wie ein Stück Zellophan über die Ebene schiebt, bis der neue Raum genau an einen vorhandenen Raum anschließt, ohne ihn zu berühren oder zu überlappen. Wenn es einen Anfall gibt, überträgt es den Raum von der Zellophanfolie auf das Hauptgitter und stanzt eine Tür heraus. Dies geschieht so oft, bis kein Platz mehr vorhanden ist.

Dieser erste Raum kann manchmal eine „Höhle“ sein – eine große, gewundene, organische Form, die einen Großteil des Levelraums ausfüllt. Diese werden erstellt, indem die Ebene nach dem Zufallsprinzip mit 55 % Boden und 45 % Wand gefüllt wird und anschließend fünf Glättungsrunden ausgeführt werden. In jeder Glättungsrunde wird jede Bodenzelle mit weniger als vier angrenzenden Bodenzellen zu einer Wand und jede Wandzelle mit sechs oder mehr angrenzenden Bodenzellen wird zu einem Boden. Dieser Prozess zwingt das zufällige Rauschen dazu, zu verschmelzen und sich zu einer mäandernden Klecksform zusammenzuziehen. Der Algorithmus wählt den größten Blob aus, der vollständig verbunden ist, und nennt ihn den ersten Raum.

Es gibt eine Reihe verschiedener Techniken zum Zeichnen eines Raums, die jedes Mal zufällig ausgewählt werden – zum Beispiel zwei übereinander liegende große Rechtecke, eine große Donutform, ein Kreis oder ein „Klecks“, der wie die oben beschriebene Höhle erzeugt wird, jedoch mit kleinere Abmessungen. Manchmal erzeugen wir den Raum so, dass an einer beliebigen Stelle ein Flur davon absteht, und verlangen, dass das Ende des Flurs mit einem vorhandenen Raum verbunden ist.

An dieser Stelle haben wir ein einfach zusammenhängendes Netzwerk unterschiedlich geformter Räume. Das Problem besteht darin, dass die Geometrie keine Schleifen enthält. Die gesamte Karte ist ein einzelner Baum, in dem jeder Raum nach dem ersten genau einen „übergeordneten“ Raum (aus dem er hervorgegangen ist) und eine beliebige Anzahl von „untergeordneten“ Räumen (die daraus hervorgegangen sind) hat. Es stellt sich heraus, dass es keinen großen Spaß macht, diese Art von Level zu erkunden, da es viele Rückschritte erfordert und es leicht ist, von Monstern in die Enge getrieben zu werden. Also beginnen wir mit der Inspektion der Wände der Ebene. Wenn wir eine Wand finden können, die auf beiden Seiten eine passierbare Zelle hat, wobei die beiden Zellen hinsichtlich der Wegfindung mindestens einen bestimmten Abstand voneinander haben, schlagen wir eine Tür (oder eine Geheimtür) ein. Wenn Sie das ein paar Mal machen, erhalten Sie ein Level, das gut miteinander verbunden ist.

Dann geht es weiter zu Seen. Seen sind Massen eines bestimmten Geländetyps – Wasser, Lava, Abgrund oder Schwefel –, die sich fast über die gesamte Ebene erstrecken können. Sie sind atmosphärisch, ermöglichen Angriffe aus der Ferne und geben dem Level eine Struktur in großem Maßstab, um zu verhindern, dass es sich wie ein homogenes Labyrinth aus verwinkelten Passagen anfühlt. Wir ziehen das Zellophan heraus und zeichnen mit der Zellularautomaten-Methode einen See darauf, und dann schieben wir das Zellophan an zufälligen Stellen herum, bis wir eine Stelle finden, die funktioniert – an der alle passierbaren Teile des Levels liegen, die nicht abgedeckt sind Die Seen sind immer noch vollständig miteinander verbunden, so dass der Spieler nie den See überqueren muss. Wenn bei zwanzig zufälligen Versuchen kein geeigneter Ort gefunden wird, zeichnen wir einen kleineren See und versuchen es erneut. Wenn wir einen geeigneten Ort finden, legen wir den See dort auf der Karte ab und überschreiben das darunter liegende Gelände. Einige Seen haben Kränze – flaches Wasser umgibt tiefes Wasser und „Abgrundrand“-Gelände umgibt Abgründe – und das zeichnen wir in dieser Phase ein.

Als nächstes geht es um die geschmackvollen lokalen Besonderheiten des Geländes – Grasbüschel, Kristallauswüchse, Schlammgruben, versteckte Fallen, Statuen, Fackeln und mehr. Diese werden in einer riesigen Tabelle von „Autogeneratoren“ definiert, die den Tiefenbereich angibt, in dem jedes Merkmal auftreten kann, wie wahrscheinlich es ist und wie viele Kopien erstellt werden müssen. Für jedes davon wählen wir einen zufälligen Ort aus und erzeugen ihn. Viele von ihnen erscheinen in Flecken. Diese werden dadurch erzeugt, dass man einen anfänglichen Standort auswählt und ihn von dort aus zufällig nach außen ausdehnen lässt, wobei die Wahrscheinlichkeit einer weiteren Ausdehnung mit jeder Ausdehnung abnimmt – so, als würde man etwas Farbe auf einen unebenen Boden gießen und sie nach außen in eine Pfütze fließen lassen.

Den nächsten großen Schritt in der Levelgenerierung nenne ich die Maschinen. Dies ist bei weitem der komplizierteste Teil der Levelgenerierung. Maschinen sind Cluster von Geländemerkmalen, die miteinander in Beziehung stehen. Jedes Mal, wenn Sie einen Altar oder einen Fall sehen, bei dem die Interaktion mit dem Gelände an einem Punkt dazu führt, dass das Gelände an einem entfernten Punkt etwas tut, sehen Sie eine Maschine. Es gibt eine von Hand gestaltete Tabelle mit Maschinen – derzeit sind es 71 –, die angibt, wo und warum jede Maschine erscheinen sollte und welche Funktionen sie bieten sollte. Jede Maschinenfunktion gibt außerdem an, ob sie nur in der Nähe der Tür des Raums oder weit davon entfernt oder in Sichtweite davon oder niemals in einem Flur oder nur in den Wänden rund um die Maschine usw. erscheinen soll.

Es gibt drei Arten von Maschinen: Raummaschinen, die das Innere eines Bereichs mit einem einzigen Engpass besetzen, Türmaschinen, die von Raummaschinen erzeugt werden, um die Tür zu bewachen, und Bereichsmaschinen, die überall erscheinen und sich nach außen ausbreiten können, bis sie an der richtigen Stelle sind Größe. Einige Maschinen zerstören einen Teil des Levels und führen einen neuen Level-Generierungsalgorithmus mit unterschiedlichen Parametern für diesen bestimmten Bereich aus. Auf diese Weise entstehen Goblin-Gehege als dichte Netzwerke aus engen, schlammverkleideten Räumen und Wächter-Tempel als kristalline Paläste aus runden und kreuzförmigen Räumen. Manchmal generiert eine Maschine einen Gegenstand, beispielsweise einen Schlüssel, und gibt ihn an eine andere Maschine weiter, um den Gegenstand zu übernehmen. Auf diese Weise erhalten Sie verschlossene Türen, deren Schlüssel an anderer Stelle im Level durch eine Falle geschützt wird. Manchmal wird die Maschine, die den Schlüssel enthält, durch eine eigene verschlossene Tür geschützt, und der Schlüssel für diese Tür ist woanders – es gibt keine Begrenzung, wie viele Ebenen der Verschachtelung zulässig sind, und die Hoffnung ist, dass verschachtelte Räume eine Art Verschachtelung verleihen narrative Konsistenz auf der Ebene durch ineinandergreifende Herausforderungen. Das Spiel verfolgt, welche Teile des Levels zu welchen Maschinen gehören, und bestimmte Arten von Geländeaktivierungen lösen Aktivierungen an anderer Stelle in der Maschine aus; Auf diese Weise kann das Abheben eines Schlüssels von einem Altar dazu führen, dass eine Fackel auf der anderen Seite des Raums das Gras im Raum entzündet. Die Maschinenarchitektur ist ein Sammelsurium von Funktionen, die dazu dienen sollen, Einträge einer Tabelle in eigenständige Abenteuer mit Hooks zu übersetzen, um sie mit anderen Abenteuern zu verknüpfen.

Nachdem die Maschinen gebaut sind, platzieren wir die Treppen. Das Obergeschoss versucht, vom darüber liegenden Stockwerk aus so nah wie möglich an den Standort im Untergeschoss heranzukommen, und das Untergeschoss wählt einen zufälligen qualifizierten Standort aus, der in angemessener Entfernung vom Obergeschoss liegt. Treppen werden automatisch benutzt, wenn der Spieler sie betritt, und sie sind in die Wand eingelassen, sodass es keinen anderen Grund gibt, darüber zu gehen. Das begrenzt die Anzahl der Orte, an denen sie erscheinen können, aber im Allgemeinen können sie ziemlich eng mit den Orten auf angrenzenden Ebenen verbunden werden.

Dann machen wir etwas Aufräumarbeiten. Wenn sich zwischen zwei Wänden eine diagonale Öffnung befindet, reißen wir eine der Wände ein. Wenn eine Tür weniger als zwei angrenzende Wände hat, stoßen wir die Tür ein. Wenn eine Mauer auf beiden Seiten von ähnlich unpassierbarem Gelände umgeben ist – denken Sie an eine Mauer, die mitten durch einen Lavasee oder über einen Abgrund verläuft –, reißen wir sie nieder. Hier werden auch Brücken über Abgründe gebaut, wo es sinnvoll ist – dort, wo beide Seiten miteinander verbunden sind und die Wegstrecke zwischen den beiden Endpunkten erheblich verkürzt wird.

Als nächstes kommen Gegenstände, die über das hinausgehen, was bereits von Maschinen platziert wurde. Es gibt einen netten Trick, um zu entscheiden, wo Gegenstände platziert werden sollen. Stellen Sie sich eine Verlosung vor, bei der jede leere Zelle der Karte eine bestimmte Anzahl an Losen in die Verlosung einbringt. Eine Zelle beginnt mit einem Ticket. Für jede Tür, die der Spieler passieren muss, um die Zelle zu erreichen, beginnend im Obergeschoss, erhält die Zelle zehn zusätzliche Tickets. Für jede Geheimtür, die der Spieler passieren muss, um die Zelle zu erreichen, erhält die Zelle zusätzlich 3.000 Tickets. Befindet sich die Zelle in einem Flur oder auf unfreundlichem Gelände, verliert sie alle ihre Tickets. Bevor wir einen Gegenstand platzieren, führen wir eine Verlosung durch, sodass Schätze eher an gut versteckten Orten abseits der ausgetretenen Pfade zu finden sind. Wenn wir einen Gegenstand platzieren, nehmen wir einige der Tickets aus den umliegenden Gebieten weg, um zu vermeiden, dass alle Gegenstände in einem einzigen Klumpen platziert werden. (Nahrungs- und Krafttränke sind Ausnahmen; sie werden ohne Vorliebe für versteckte Räume platziert, da sie sorgfältig dosiert sind und das Fehlen dieser Tränke den Spieler erheblich zurückwerfen kann.) Es gibt auch mehr Gegenstände auf den sehr frühen Levels, um das zu beschleunigen Punkt, an dem der Spieler mit dem Zusammenschustern eines Builds beginnen kann.

Zuletzt kommen Monsterhorden. Sie werden zufällig und einheitlich platziert – jedoch nicht im Blickfeld der oberen Etage, damit der Spieler nicht in einen Hinterhalt gerät, wenn er das Level zum ersten Mal betritt. Manchmal werden die Monster aus einem tieferen Level gezogen oder mit einer zufälligen Mutation erzeugt, um den Spieler auf Trab zu halten.

Und damit ist das Level beendet!

Viele der Wahrscheinlichkeiten während dieses Prozesses variieren je nach Tiefe. Je tiefer man geht, desto organischer und höhlenartiger werden die Ebenen, man sieht mehr Lava und Schwefel, Geheimtüren werden häufiger, Gras und Heilpflanzen werden seltener und Fallen und Kristallformationen werden häufiger. Es ist stufenweise, aber wenn man es schafft, sich das Amulett von Yendor auf der 26. Ebene zu schnappen, macht sich der Unterschied beim schnellen Aufstieg bemerkbar.

RPS: Vor welchen Herausforderungen standen Sie, als Sie versuchten, diese Level zu erstellen?

Wanderer:Das größte Problem besteht darin, dass Randfälle bei der Levelgenerierung schwer zu finden sein können. Wenn ich dem Levelgenerierungsalgorithmus eine neue Funktion hinzufüge, denke ich normalerweise darüber nach, eine bestimmte Geländekonfiguration auf eine bestimmte Weise zu berücksichtigen. Aber das Spiel wird immer an fünfzig weitere Geländekonfigurationen denken, mit denen ich nicht gerechnet habe, von denen die meisten auf tragische Weise zum Scheitern des Features führen und einige davon äußerst selten sein werden. Und wenn ein vielversprechender Charakter aufgrund eines Fehlers bei der Geländegenerierung stecken bleibt, ist das eine wirklich schlechte Erfahrung. Deshalb muss ich diese Funktionen viel testen und reparieren.

Das war eigentlich der ursprüngliche Zweck der „Seed“-Funktion: damit ich seltene Fehler bei der Levelgenerierung reproduzieren konnte, wenn Spieler sie erlebten. Zufallszahlengeneratoren generieren lediglich Zahlenfolgen, die im normalen Gebrauch chaotisch wirken. Sie erzeugen jedes Mal dieselbe Sequenz, es sei denn, Sie starten die Sequenz mit einer anderen Startnummer. Wenn also ein Brogue-Spiel beginnt, wird der RNG mit einem Master-Seed gesetzt – standardmäßig der Tageszeit. Dann zieht es zunächst vierzig Zufallszahlen aus dem RNG und schreibt sie in eine Liste. Wenn Sie in eine neue Tiefe abtauchen, zieht das Spiel den nächsten Eintrag aus der Zahlenliste und verwendet ihn, um den RNG zu bestimmen, bevor das Level generiert wird. Das bedeutet, dass die Level jedes Mal genau gleich sind, wenn Sie mit demselben Master-Seed spielen. Aber was als Funktion zur Unterstützung bei der Reproduktion von Fehlern begann, ist heute die Grundlage von Seed-Wettbewerben, bei denen eine Gruppe von Spielern auf der ganzen Welt mit demselben Seed beginnen und vergleichen, wie es ihnen im selben Dungeon ergangen ist.

Die Levelgenerierung ist das Herz und die Seele eines Roguelike-Spiels. Mehr als alles andere bestimmen das Gefühl der Umgebung und ihre anhaltende Neuheit das Erlebnis. Es so zu gestalten, dass es aufregende Erlebnisse ermöglicht, ist wie der Bau einer magischen Maschine, die Ihnen Geschichten für immer erzählen kann. Ich begann mit dem Schreiben von Brogue, indem ich mir die perfekte Roguelike-Dungeon-Umgebung vorstellte, in der ich schon immer spielen wollte, und baute zunächst den Prototyp-Level-Generator, um dieses Erlebnis zu schaffen. Sobald ich aufregende Umgebungen hatte, die mich dazu einluden, sie zu erkunden, wurde ihre Erkundung zur dauerhaften Motivation für die Entwicklung des restlichen Spiels.

RPS: Wie stellen Sie angesichts der Prozeduralität der Level sicher, dass das Spiel fair ist? Gibt es eine Post-Level-Generierungsprüfung, die Dinge wie Tränke/Feinde/Gegenstände ausgleicht, um schwieriges oder spärliches Gelände usw. zu berücksichtigen?

Wanderer:Absolut! Hinter den Kulissen gibt es eine Menge kleiner Tricks, um Brogue fair zu gestalten, auch wenn die Charakterentwicklung durch zufällig generierte Gegenstände gesteuert wird. Krafttränke, Lebenstränke und Verzauberungsschriftrollen sind in ihrer Generation mit „Gummibändern“ versehen, sodass Sie in jedem Spiel ungefähr die gleiche Anzahl und mit ungefähr der gleichen Rate erhalten. Mit jeder neuen Tiefe steigt ihre Erzeugungswahrscheinlichkeit, und jedes Mal, wenn sie erzeugt werden, sinkt ihre Erzeugungswahrscheinlichkeit. Durch Anpassen der Größe dieser Deltas wird bestimmt, wie eng das Gummiband ist. Nahrung wird noch strenger erzeugt; Es gibt eine absolute Untergrenze für die Menge an Nahrung, die in einer bestimmten Tiefe erzeugt wird, und sie erscheint, wann immer es nötig ist, um über dieser Grenze zu bleiben. Es gibt auch Tresore, aus denen der Spieler einen beliebigen starken Gegenstand auswählen kann, und es ist sehr wahrscheinlich, dass diese Tresore mindestens einmal im frühen Dungeon auftauchen – es kommt also sehr selten vor, dass das Spiel nicht genügend Gegenstände dafür bereitstellt ein erfahrener Spieler, der einen Build zusammenschustert.

RPS: Wie gewährleistet man genügend Abwechslung, ohne eine Geometrie zu erzeugen, die „falsch“ oder zu zufällig oder gelegentlich mit Extremen gefüllt ist? Was macht den Unterschied zwischen einem präskriptiven Regelwerk, das langweilige Levels ohne die Hand eines Designers produziert, und der Freiheit in diesen Regeln für organische und aufregende Zufälligkeiten?

Wanderer:Nun, ein Ansatz, den ich ausdrücklich vermieden habe, ist die Definition irgendeiner Art von Tresor auf einem Raster. Die Datendateien enthalten keine Raster! Stattdessen müssen Maschinen das Gelände so anpassen, wie sie es vorfinden. Jeder Bereich des Levels, der einen einzigen Engpass hat, könnte in eine Raummaschine umgewandelt werden. Dadurch wurde der Aufbau des Maschinensystems erheblich erschwert, es erfordert umfassende Tests und sehr selten kann man Räume finden, die etwas fehlerhaft sind (allerdings nie in einer Weise, die den Fortschritt behindert). Ich denke jedoch, dass sich der zusätzliche Aufwand lohnt, da sich prozedural generierte Tresore organischer anfühlen und mehr Potenzial für interessante Überraschungen bieten.

RPS: Beschränken oder befreien ASCII-Grafiken die prozedurale Generierung? Brogue ist für ein ASCII-Spiel ungewöhnlich schön.

Wanderer:Zugegebenermaßen sind sie insofern einschränkend, als man pro Quadrat nur ein Schriftzeichen und zwei Farben erhält, was zu schwierigen Designentscheidungen führt, wenn viele sekundäre Informationen übermittelt werden müssen. Aber sie sind in dem Sinne befreiend, dass sie die räumliche Lage und Identität des gesamten Inhalts des Verlieses mit kristallklarer Klarheit vermitteln und den Rest dann einer gut ausgebildeten Fantasie überlassen. Zu diesem Zweck wimmelt es in Brogue von Flavour-Texten – es gibt Flavour-Texte für jedes Monster und jeden Gegenstand, es gibt eine ganze Zeile der Benutzeroberfläche, die permanent Flavour-Texten gewidmet ist, und alles beschreibt ständig, was man sieht, hört, riecht und fühlt und probieren Sie es, während Sie durch die Kerker wandern. Dem kann man nicht entkommen! Eine vollfarbige dynamische Beleuchtungsmaschine leistet hier ebenfalls einiges an Arbeit, um die Feuer heiß brennen zu lassen und die Schwaden leuchtender Pilze zum Schimmern zu bringen. Ein herausforderndes Spiel verlangt von Ihnen, Ihre Strategie zu optimieren, aber Brogue gibt sich alle Mühe, Sie davon zu überzeugen, dass sein Dungeon ein Ort und nicht ein Gleichungssystem ist.

RPS: Vielen Dank für Ihre Zeit.

Weitere Informationen darüber, was Brogue so großartig macht, finden Sie in unseremGeschichte vom Trinken auf dem Weg zum ewigen TodVerwenden Sie die Auswahl an mysteriösen Tränken des Spiels.

Dieser Beitrag wurde ermöglicht durchRPS-Unterstützerprogramm. Vielen Dank an alle, die die Seite unterstützen!